当一个将两个变量别名为
时int a;
const int &b = a;
这两个变量实际上是相同的,因此应用于变量a
的任何更改也会应用于变量b
。但是,当使用指针完成相同的技巧时,它似乎不会以相同的方式工作,如以下程序所示:
#include <iostream>
int main(void) {
int *a = (int*) 0x1;
const int *const &b = a;// Now b should be an alias to a.
a = (int*) 0x2;// This should change b to 0x2.
std::cout << b << "\n";// Outputs 0x1 instead of the expected value of 0x2.
return 0;
}
现在,变量a
似乎不是变量b
的别名,但为什么呢?
答案 0 :(得分:12)
const int *const &
是对const
指向const int
的引用。 (尝试从右向左阅读。)请注意,指针的类型为const int *
,但不是int *
(即a
的类型)。引用不能直接绑定到不同的类型。对于const int *const &b = a;
,将构造临时 * (类型为const int *
,从a
复制),然后绑定到引用;临时与a
无关,因此对b
的任何修改都不会影响a
。
注意区别。在第一个示例中,const
上发出了int
;在第二个示例中,const
不仅限制了指针本身,还限定了指针,它使得两个指针的类型不同(int *
与const int *
)。如果您想要对其const
进行限定(这对您的实验来说似乎没有必要),您应该只在指针本身上对其进行限定,即int * const &
。
* lifetime of the temporary已延长至参考b
的生命周期。
答案 1 :(得分:5)
const int * const & b
表示对const int的const指针的引用。你想要的是int * const & b
使用这个方便的工具来破译复杂的声明。 https://cdecl.org/