我知道i
in 下面的类型main()
是int&
. 这就是为什么它必须被初始化。
int& f(){ static int i = 1; return i; }
int main()
{
decltype(f()) i = f();
}
但是使用标准中的段落5p5
,我得出结论,当引用被删除时,表达式f()
具有类型。int
从,如果从函数返回中删除了引用7.1.6.2p4
,怎么能说表达式f()
是左值呢?
在评估表达式的类型时会删除引用(根据第 5/5 节),但这不会改变函数调用表达式f()
是左值的事实。根据 C++11 标准的第 5.2.2/10 段:
如果结果类型是左值引用类型或对函数类型的右值引用,则函数调用是左值,如果结果类型是对对象类型的右值引用,则为xvalue ,否则为纯右值。
换句话说,引用不是从函数本身的返回类型中删除的,而是从计算的函数调用表达式的类型中删除的(因此,是int
)。
函数返回左值引用这一事实允许类型系统将相应的函数调用表达式分类为左值- 这反过来又允许decltype
将左值引用添加到表达式的类型,从而产生int&
.