C++Primer 设置一个类型为auto的引用时,初始值中的顶层常量属性仍然保留。和往常一样,如果我们给初始值绑定一个引用,则此时的常量就不是顶层常量了。

首先是第一句话“设置一个类型为auto的引用时,初始值中的顶层常量属性仍然保留。
解释:首先用一段程序来表示
const int x=100;
auto &y=x; //此时x是初始值,y的类型是const int&,也就是一个常量引用。

从上面来理解“初始值的顶层常量属性仍然保留”,可以很容易理解到,当定义了类型为auto的引用后,即auto &y=x; 它的初始值x还是一个const int 型的对象,也就是一个顶层的const对象。

程序实际运行如下:
C++Primer 设置一个类型为auto的引用时,初始值中的顶层常量属性仍然保留。和往常一样,如果我们给初始值绑定一个引用,则此时的常量就不是顶层常量了。_第1张图片
C++Primer 设置一个类型为auto的引用时,初始值中的顶层常量属性仍然保留。和往常一样,如果我们给初始值绑定一个引用,则此时的常量就不是顶层常量了。_第2张图片
从上两图可以看出,当我定义auto引用后,我想给x和y另外赋值时,程序运行时是显示错误的。
错误原因就是表达式左侧必须是可修改的,那么就说明x和y是个常量。那么就可以证明我所说的是正确的。

然后是第二句“和往常一样,如果我们给初始值绑定一个引用,则此时的常量就不是顶层常量了
注意这句话“和往常一样”,那么就不是上面这种情况——定义auto类型的引用,而是一般下定义引用的情况。
这里初始值的跟上面的初始值的意思是一样的,即我假定的const int x=100;这里的x就是初始值,类型就是const int——整型常量。
接下来是这句话“如果我们给初始值绑定一个引用”,这句话意思就是我们定义一个引用去绑定整型常量x;那么我们想到绑定整型常量的引用一定是一个常量引用对吧,那么就要回到2.4.1节 const的引用这一节(P54)。即编写程序:const int &z=x;
执行完上面的操作后,你会发现这里z是一个const int&是一个常量引用,在2.4.3 顶层const(P57-58)这一节中说过,用于声明引用的const都是底层const。

那么就可以证明最后一句话“则此时的常量就不是顶层常量了”。

**注意:**第一句话的常量和第二句话的常量的意思是不一样的。因为第一句表明了它是初始值的常量;而第二句只是说了此时的常量,并没有表明它是初始值得常量,那么它是常量引用中的常量。

你可能感兴趣的:(c++)