当 T 是引用类型时,为什么 const T& 参数中的 const 会消失? [复制]

2023-11-20

以下代码显示,如果模板采用 ref-to-const参数用引用类型实例化(例如,int&),参数不是const:

#include <iostream>

template<typename T>
void f(const T& arg)         // arg isn't const if T is a reference type
{
  arg = -1;
}

int main()
{
  int x = 0;
  f<int&>(x);                // instantiate f with reference type
  std::cout << x << '\n';    // prints -1 under gcc, clang, and msvc
}

这里发生了什么?

我的猜测是初始类型arg is int & const &这会以某种方式转化为int&。如果是这样,就标准而言,到底是如何发生的?如果这不是正在发生的事情,那是什么?


谢谢弗拉德(来自莫斯科)的回答C++:使用显式指定引用类型作为类型参数的模板函数,我相信关键在于const-disappearance 是 [dcl.ref],其中表示:

在一份声明中T D where D有两种形式之一

& attribute-specifier-seqopt D1
&& attribute-specifier-seqopt D1

以及声明中标识符的类型T D1 is “派生声明符类型列表 T”,那么标识符的类型D is “派生声明符类型列表参考T”。可选的属性说明符序列属于引用类型。简历合格 除非引入简历限定符,否则引用格式不正确 通过使用typedef 名称([dcl.typedef], [temp.param]) 或decl类型说明符([dcl.type.simple]),在这种情况下,简历限定符将被忽略.

我已经加粗了相关文字。 (我想按照标准格式设置整个段落的格式,但我不知道如何获得正确的缩进并添加下标。)

一旦const消失,正常参考崩溃像往常一样开始。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当 T 是引用类型时,为什么 const T& 参数中的 const 会消失? [复制] 的相关文章

随机推荐