为什么decltype(auto)会在这里返回引用?

时间:2014-12-18 23:15:30

标签: c++ auto c++14 decltype

我认为(想到)我理解autodecltype相同。但是,在C ++ 14中,可以有一些像decltype(auto)这样的反义词作为函数的返回类型。请考虑以下事项:

decltype(auto) foo()
{
    int m = 1;
    return m;
}

返回类型为int,一切都有意义。

然而,

decltype(auto) foo()
{
    int m = 1;
    return (m);
}

返回int&(即对int的引用)。

我绝对没有想法为什么会发生这种情况,为什么这些括号会有任何不同!?希望有人可以对此有所了解。

PS:我还标记了C++,因为检查C++代码的人数多于C++14

1 个答案:

答案 0 :(得分:31)

7.1.6.2 [dcl.type.simple]

  
      
  1. 对于表达式e,由decltype(e)表示的类型定义如下:
       - 如果e是未表示的id-expression或未加密的类成员访问(5.2.5),则decltype(e)是e命名的实体的类型。如果没有这样的实体,或者e命名了一组重载函数,则该程序格式不正确;
       - 否则,如果e是x值,则decltype(e)是T&&,其中T是e的类型;
       - 否则,如果e是左值,则decltype(e)为T&amp ;,其中T是e的类型;
       - 否则,decltype(e)是e的类型。
  2.   

在您的示例中,您有return (m),因此e(m)。这不是一个没有特写的id-expression或类成员访问,所以我们转到第二个项目符号。它不是xvalue所以我们去第三个子弹。它是一个左值,因此类型为T&,其中Tint