c++ - 混淆三种引用形式

标签 c++

  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/

相关文章:

c++ - 使用 DirectX (2D) 创建多层渲染

c++ - 在 SDL2 中,游戏显示在屏幕的左下角

c++ - 在构造变量之前引用变量是否定义明确

c++ - C++ 中的 header 保护问题

c++ - 在类定义中与在构造函数中将对象声明到堆栈上

c++ - Qt - 如何为 QProgressBar 组合 QtConcurrent 和 QThreadPool?

c++ - 传递一个类的指针

c++ - 当 std::vector push_back() 具有引用成员的对象时

c++ - 错误C2664:无法将参数1从 'const char [14]'转换为 'char'

c++ - 创建用户所需的输入对象数 C++