接受通用引用并返回const引用的函数的无法解释的行为

Ale*_*yan 12 c++ c++11 c++14

我一直认为接受通用引用的以下函数必须返回一个const-reference.

template <typename T>
const T& Const(T&& val)
{
    return val;
}
Run Code Online (Sandbox Code Playgroud)

但是,以下代码使用VS C++和gcc成功编译:

int x = 5;
Const(x) = 6;
Run Code Online (Sandbox Code Playgroud)

运行后变量x的值等于6.因此,Const函数返回非const引用.

要获得编译器错误,必须修改函数Const以接受传统的l值引用或声明为返回const std::remove_reference_t<T>&.

这是为什么?我错过了什么规则?提前致谢!

Vit*_*meo 15

一个普遍的参考

不,他们被称为"转发参考"."通用引用"一词已弃用.


这是为什么?

当你调用时Const(x),x是一个左值,因此T推导为int&.您的退货类型将变为:

  • const T & = T const &- > int & const &- >int &

int & const &是对与其相同的引用的const引用.(在这种情况下,适用于,不只是作为).intint&constint&intT = int&

  • 东const是最好的常量! (4认同)
  • 重新阅读了你的答案,看看你的意思.看到`const int &&`和一个解释,这意味着`const`应用于`int&`有点误导.我可以建议把它写成`const T&= T const&` - >`int&const&` - >`int&`? (3认同)
  • 这是为什么左边(const const)的`const`只是混淆的一个典型例子.它不仅混淆了OP,解决它的人也搞砸了它. (3认同)
  • @JonKalb他们可以这样.Nyaa. (2认同)