2013-05-27 57 views
6

我知道i的类型在main()以下是int&。这就是为什么它必须被初始化。main()中的'i'类型。为什么它是一个int&?

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

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

但是用在标准段落5p5,我的结论是表达f()已键入int作为参考被丢弃。

7.1.6.2p4,如果表达式f()是一个左值,考虑到引用是从函数返回中删除的?

+0

请注意,这几乎就是C++ 14'decltype(auto)'特性的工作方式。 – PlasmaHH

回答

6

基准计算表达式的类型(如每§5/5)时被丢弃,但是这并不改变的事实,函数调用表达式f()左值。每一段的C++ 11标准的5.2.2/10:

函数调用是左值如果结果类型是左值引用类型或右值参考起作用 类型,xvalue如果结果类型是右值对对象类型的引用,否则返回

换句话说,参考不从函数本身的返回类型下降,仅从评价函数调用表达式的类型(这是因此,int)。

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

相关问题