系统环境: windows 10 1703
编译环境:Visual studio 2017
2.30
const int v2 = 0, v2 是顶层 const;
int v1 = v2, v1 是非常量,v2 是顶层 const;
int *p1 = &v1, &r1 = v1, p1 是非常量指针,r1 是非常量引用;
const int *p2 = &v2, *const p3 = &i, &r2 = v2, *p2 是底层 const,p3 既是顶层 const 也是底层 const,r2 是底层 const。
2.31
r1 = v2, 合法,拷贝 v2 的值给和 r1 绑定的 v1,v2 是顶层 const,对此操作无影响;
p1 = p2, 非法,p2 是底层 const,p1 不是;
p2 = p1, 合法,把 p1 指向的对象赋给 p2;
p1 = p3, 非法,p3 包含底层 const 的定义,而 p1 没有;
p2 = p3, 合法,将 p3 指向的对象赋给 p2。
2.32
非法。有很多修改方法,下面列出其中两种
#include <iostream>
int main()
{
int null = 0, *p = &null;
std::cout << null << " " << p << " " << *p << std::endl;
return 0;
}
输出为 0 0000007D066FFAF0 0
#include <iostream>
int main()
{
int null = 0, *p = nullptr;
std::cout << null << " " << p << " " << *p << std::endl;
return 0;
}
输出为 0 0000000000000000
2.33
a = 42, 将 42 赋给 a;
b = 42, 将 42 赋给 b;
c = 42, 将 42 赋给 c;
d = 42, 非法,不能将字面量赋给指针 d;
e = 42, 非法,不能将字面量赋给指针 e;
g = 42, 非法,不能改变常量 ci 的值 (g 为绑定到 ci 的常量引用)
2.34
正确
2.35
j int;k const int(整形常量引用);p 指向整型常量的指针;j2 整型常量;k2 整型常量引用
2.36
a int 4
b int 4
c int 3
d int& 绑定到a
2.37
a int 3
b int 4
c int 3
d int& 绑定到 a
2.38
decltype 处理顶层 const 和引用的方式与 auto 有些许不同。如果 decltype 使用的表达式是一个变量,则 decltype 返回该变量的类型(包括顶层 const 和引用在内)
int i = 0, &r = i;
//相同
auto c1 = i; c1 是 int
decltype(i) c2; c2 是 int
//不同
auto c3 = r; // c3 是 int
decltype(r) c4 = r // c4 是 int& 绑定到 r