2.26 (a)错误,const对象必须初始化;
(d)错误,const对象的值不能再改变。
2.27 (a)错误,非常量引用不能绑定到字面值;
(b)合法;
(c)合法,常量引用可以绑定字面值;
(d)合法,p3指向的值和自身都不能改变;
(e)合法;
(f)错误,引用不是对象,不能让引用不变;
(g)合法。
2.28 (a)非法,cp必须初始化;
(b)非法,p2必须初始化;
(c)非法,ic必须初始化;
(d)非法,p3必须初始化;
(e)合法。
2.29 (a)合法; (b)合法; (c)非法,普通指针p1不能指向常量;
(d)非法,p3定义后不能再赋值; (e)非法,p2不能再赋值; (f)非法,常量ic不能赋值。
2.30 v2:顶层const; p2:底层const; p3:顶层const;r2:底层const。
2.31 r1 = v2; //合法
p1 = p2; //非法,非常量指针不能指向常量 p2 = p1; //合法
p1 = p3; //非法,非常量指针不能指向常量 p2 = p3; //合法,p2和p3都是底层const
2.32 非法,int变量直接赋给指针是错误操作,即使其为0也不行。
2.33 auto会忽略顶层const,保留底层const,前三条语句正确;
d = 42; //错误,d是指针;
e = 42; //e是指向整数常量的指针
g = 42; //g是一个常量引用,不能修改其值
2.34
#include <iostream>
using namespace std;
int main()
{
int i = 0, &r = i;
auto a = r;
const int ci = i, &cr = ci;
auto b = ci;
auto c = cr;
auto d = &i;
auto e = &ci;
auto &g = ci;
a = 42;
b = 42;
c = 42;
/* 错误语句
d = 42;
e = 42;
g = 42;
*/
return 0;
}
2.35 i:整型常量; j: 整型; k:整型常量; p:指向整型常量的指针; j2:整型常量; k2: 整型常量
2.36 a: int; b: int; c: int; d: int &; a = 4; b = 4; c = 4; d = 4;
2.37 a: int; b: int; c: int; d: int &; a = 3; b = 4; c = 3; d = 3;
decltype(a = b),a = b作为参数,只推断类型,不计算结果。
2.38 auto:计算变量初值推断其类型;decltype只分析表达式得到类型,并不计算;
auto: 忽略顶层const;decltype: 保留顶层const;
decltype给变量加上括号,将得到引用类型。
例如:int a = 0; auto b = a; decltype(a) c; //类型一样
const int b = 2; auto e = d; decltype(b) e; //d为int, e为const int,类型不一样
本文详细解答了C++ Primer第五版2.4至2.5.3节的部分练习,涉及const对象的初始化、引用绑定规则、指针与常量的交互、auto和decltype的用法等核心概念。
4669

被折叠的 条评论
为什么被折叠?



