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

Kno*_*abe 5 c++ templates type-deduction

以下代码显示,如果const使用引用类型(例如,int&)实例化采用ref-to-参数的模板,则该参数不是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
}
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?

我的猜测是,最初的类型argisint & const &并且它以某种方式转换为int&. 如果是这样,就标准而言,这究竟是如何发生的?如果这不是正在发生的事情,那是什么?

Pra*_*han 3

A是其值无法修改的const T类型的对象。T但是,当T是引用类型时,const修饰符是多余的,因为引用一旦初始化就无法更改 - 它们始终引用同一个对象。因此,const TwhenT=int&只是 a T(在本例中是int&)。因此,采用的参数f<int&>是对 的左值引用int&,根据 c++11 的折叠规则,它只是int&