我知道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()
是左值?
答案 0 :(得分:6)
在评估表达式的类型时会删除引用(根据§5/ 5),但这不会改变函数调用表达式f()
是 lvalue 的事实。根据C ++ 11标准的第5.2.2 / 10段:
如果结果类型是 lvalue 引用类型或 rvalue 对函数的引用,则函数调用是左值 如果结果类型是对象类型的 rvalue 引用,则输入 xvalue ,否则输入 prvalue 。
换句话说,引用不会从函数本身的返回类型中删除,只能从已计算的函数调用表达式的类型中删除(因此,int
)。
函数返回 lvalue 引用这一事实允许类型系统将相应的函数调用表达式分类为 lvalues - 这反过来允许{{ 1}}将左值引用添加到表达式的类型中,从而产生decltype
。