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类型