练习2.36、2.37、2.38

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

int a=3,b=4;

decltype(a) c=a;  //c是int类型的变量

decltype((b)) d=a;  //d是int&类型的变量  

++c;    //c=4

++d;    //d=4,a=4

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

int a=3,b=4;

decltype(a) c=a;  //c是int类型的变量,其值为3

decltype(a=b) d=a;  //d是int&的引用,d的值即a的值为3

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

auto指定的类型是根据表达式的类型判断其变量的类型,并将表达式的值初始化该变量,(编译器通过计算变量的值来判断其类型)其对顶层const对象直接忽略,只关心底层const对象。

decltype指定的类型是根据选择并返回其操作数的结果作为其变量类型(分析表达式,并得到它的类型),没有实际计算表达式的值,其与auto不同,它同样关注顶层const对象,也关心底层const对象,而且如果表达式是赋值左值表达式的特殊表达式,其返回的结果则是引用,并且其类型就是左值类型。

两者相同:

1 int i=0;
2 auto a=i;
3 decltype(i) a=0;

两者不同:

1 const int i=0,&r=i;
2 auto a=i;    //int类型
3 auto ar=r;    //int类型
4 decltype(i) d=0;    //const int 类型
5 decltype(r+0) dr=0;//int类型

  

原文地址:https://www.cnblogs.com/Dark-King/p/9372068.html