main()下面的'i'类型。为什么它是一个int&?

时间:2013-05-27 14:09:04

标签: c++ c++11 decltype

我知道i下面main()的类型是int&。这就是必须初始化的原因。

int& f(){ static int i = 1; return i; }

int main()
{
    decltype(f()) i = f();
}

但是在标准中使用段落5p5,我得出结论,表达式f()的类型为int,因为删除了引用。

7.1.6.2p4开始,如果从函数返回中删除了引用,怎么能说表达式f()是左值?

1 个答案:

答案 0 :(得分:6)

在评估表达式的类型时会删除引用(根据§5/ 5),但这不会改变函数调用表达式f() lvalue 的事实。根据C ++ 11标准的第5.2.2 / 10段:

  

如果结果类型是 lvalue 引用类型或 rvalue 对函数的引用,则函数调用是左值   如果结果类型是对象类型的 rvalue 引用,则输入 xvalue ,否则输入 prvalue

换句话说,引用不会从函数本身的返回类型中删除,只能从已计算的函数调用表达式的类型中删除(因此,int)。

函数返回 lvalue 引用这一事实允许类型系统将相应的函数调用表达式分类为 lvalues - 这反过来允许{{ 1}}将左值引用添加到表达式的类型中,从而产生decltype