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

Ayr*_*osa 6 c++ decltype c++11

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

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

int main()
{
    decltype(f()) i = f();
}
Run Code Online (Sandbox Code Playgroud)

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

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

And*_*owl 6

在计算表达式的类型时会删除引用(根据§5/ 5),但这并不会改变函数调用表达式f()左值的事实.根据C++ 11标准的5.2.2/10段:

如果结果类型是左值引用类型或对函数类型的右值引用,则函数调用是左值;如果结果类型是对象类型的右值引用,则为xvalue,否则为prvalue.

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

该函数返回一个事实左值参考是允许相应函数调用表达式作为类型系统来分类的左值 -这,反过来,允许decltype对加左值参考表达式的类型,因而产生int&.