0
  T const&
  const T&
  T& const   //error

以上三者有什么区别?如果&*,会发生什么?

4

1 回答 1

5

前两种形式是等价的,尽管我更喜欢第一种形式,因为它更容易推理模板参数推导,并且它澄清了什么是常量(它之前的所有内容):因此,int const*const int*.

此外,没有办法用前缀语法声明一个常量指针(例如,没有等价的int* constwhereconst出现在类型的开头)。因此,为了语法统一,我宁愿总是使用后缀版本。

第三种形式在常规上下文中使用是错误的,相当于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
于 2013-02-23T02:05:43.350 回答