T const&
const T&
T& const //error
以上三者有什么区别?如果&
是*
,会发生什么?
前两种形式是等价的,尽管我更喜欢第一种形式,因为它更容易推理模板参数推导,并且它澄清了什么是常量(它之前的所有内容):因此,int const*
比const int*
.
此外,没有办法用前缀语法声明一个常量指针(例如,没有等价的int* const
whereconst
出现在类型的开头)。因此,为了语法统一,我宁愿总是使用后缀版本。
第三种形式在常规上下文中使用是错误的,相当于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