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