【问题标题】:Why does the const in a const T& parameter disappear when T is a reference type? [duplicate]当 T 是引用类型时,为什么 const T& 参数中的 const 会消失? [复制]
【发布时间】:2015-02-27 22:15:57
【问题描述】:

以下代码显示,如果使用引用类型(例如,int&)实例化采用 ref-to-const 参数的模板,则该参数不是 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 的初始类型是int &amp; const &amp;,并且这会以某种方式转换为int&amp;。如果是这样,就标准而言,这究竟是如何发生的?如果这不是发生了什么,那是什么?

【问题讨论】:

标签: c++ templates type-deduction


【解决方案1】:

感谢Vlad from MoscowC++: template function with explicitly specified reference type as type parameter的回复,我相信const-disappearance的症结是[dcl.ref],上面写着:

T D 的声明中,D 具有以下任一形式

& 属性说明符序列opt D1
&& 属性说明符序列opt D1

声明T D1中的标识符类型为 “derived-declarator-type-list T”,然后是D的标识符的类型 是“derived-declarator-type-listT 的引用。”可选的 attribute-specifier-seq 属于引用类型。 Cv 合格 引用格式错误,除非引入 cv 限定符 通过使用 typedef-name ([dcl.typedef], [temp.param]) 或 decltype-specifier ([dcl.type.simple]),在这种情况下忽略 cv 限定符

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

一旦const 消失,正常的参考折叠就会像往常一样开始。

【讨论】:

  • 这似乎是正确的答案。请注意,在 stackoverflow.com/a/14761809/777186 中,Yakk 是从 8.3.2/5(在 C++11 的预发布版本中曾经是 14.3.2/4)派生出来的。
【解决方案2】:

const TT 类型的对象,其值无法修改。然而,当T 是引用类型时,const 修饰符是多余的,因为引用一旦初始化就不能更改——它们总是引用同一个对象。因此,const TT=int&amp; 只是一个T(在这种情况下是int&amp;)。因此,f&lt;int&amp;&gt; 采用的参数是对 int&amp; 的左值引用,根据 c++11 的折叠规则,它就是 int&amp;

【讨论】:

  • 您能否就标准中指定此行为的位置提供一些指导,即,当 T 是引用类型时,它说 const T 是 T 的位置?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-22
  • 2013-02-17
  • 2021-11-05
  • 2012-08-02
  • 2012-09-04
  • 2019-06-26
  • 2022-12-18
相关资源
最近更新 更多