chapter 2 处理类型(类型别名、auto、decltype)

2018-03-15

2.33 利用本节定义的变量,判断下列语句的运行结果。

a = 42; b = 42; c = 42;

d = 42; e = 42; g = 42;

a, b, c 都是整型,可以赋值

d是整型指针,不能从int到int*

e是指向整数常量的指针,不能从int到int*

g是常量引用,不能给常量赋值

 

2.34 基于上一个练习中的变量和语句编写一段程序,输出赋值前后变量的内容,你刚才的推断正确吗

 

2.35 判断下列定义推断出的类型是什么,然后编写程序进行验证。

const int i = 42;      

auto j = i;        // int j = i;

const auto &k = i;        // const int &k = i;

auto *p = &i;        // const int *p = &i;

const auto j2 = i, &k2 = i;   // const int j2 = i, &k2 = i;

 

2.36 关于下面代码,请指出每一个变量的类型以及程序结束时它们各自的值。

int a = 3, b = 4;

decltype(a) c = a;

decltype((b)) d = a;

++c;

++d;

解:int a = 4;

  int b = 4;

  int c = 4;

  int d = 4;

 

2.37 赋值是会产生引用的一类典型表达式,引用的类型就是左值的类型。也就是说,如果i是int,则表达式i = x的类型就是int&.根据这一特点,请指出下面的代码中每一个变量的类型和值。

网上参考答案:

int a = 3, b = 4;

decltype(a) c = a;

decltype(a = b) d = a;

解:int c = 3;

  int &d = 3;  //a = b, a是int型,那么表达式为int&类型

 

2.38 说明由decltype指定类型和由auto指定类型有何区别。请举出一个例子,decltype指定的类型与auto指定的类型一样;再举一个例子,decltype指定的类型和auto指定的类型不一样。

auto关键字根据初始式推断对象的类型:

auto i1 = 12; int

auto &i2 = i1;  int &

 

decltype (a) 关键字的推断规则:

1、如果a是一个标识符,则推断结果与标识符的类型一致

2、如果a是一个表达式,并且a的结果是将亡值(std::move),则推断结果为右值

3、如果a是一个表达式,并且a的结果是左值,则推断结果为左值

4、其他情况与a类型一致

 

不同:

const int ci = 0, &cj = ci;

decltype( ci ) x = 0;  //x为const

auto x = ci;       //x为int, 对顶层const处理不同

相同:

int ci = 0, &cj = ci;

decltype(ci) x = 0;    //x为int

auto x = ci;          //x为int

posted @ 2018-03-16 19:24  抹茶奶绿不加冰  阅读(231)  评论(0编辑  收藏  举报