T const&
const T&
T& const //error
以上三者有什么区别?如果 &
是 *
,会发生什么?
最佳答案
前两种形式是等价的,尽管我更喜欢第一种形式,因为它更容易推理模板参数推导,并且它阐明了什么是常量(它之前的所有内容):因此,int const*
优于 const int*
。
此外,没有办法用前缀语法声明一个常量指针(例如,没有 int* const
的等价物,其中 const
出现在方式)。因此,为了句法统一,我宁愿始终使用后缀版本。
第三种形式在常规上下文中使用时是错误的,它等同于推导模板参数时的T&
(引用不能被重新赋值,所以它们在某种意义上总是常量,const
被认为是多余的)。
如果将 &
更改为 *
,那么前两种形式仍然相同,而第三种现在声明一个常量指针指向T
类型的对象。请注意,这意味着指针本身是常量(您不能重新分配它),而不是所指向的对象。
int a = 0;
int b = 1;
int* const pA = &a; // p cannot be reassigned, a can be modified
*pA = 42; // OK
pA = &b; // ERROR
int const* pB = &b; // p can be reassigned, b cannot be modified
*pB = 42; // ERROR
pB = &a; // OK
int const* const pC = &a; // p cannot be reassigned, a cannot be modified
*pC = 42; // ERROR
pC = &b; // ERROR
int& const d = a; // ERROR
关于c++ - 混淆三种引用形式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15036199/