【问题标题】:The type of 'i' below in main(). Why is it an int&?main() 中下面的 'i' 的类型。为什么是int&?
【发布时间】:2013-05-27 14:09:03
【问题描述】:

我知道下面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() 是一个左值?

【问题讨论】:

  • 请注意,这几乎与 C++14 decltype(auto) 功能的工作方式完全相同。

标签: c++ c++11 decltype


【解决方案1】:

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

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

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

函数返回 lvalue 引用的事实允许类型系统将相应的函数调用表达式分类为 lvalues - 这反过来又允许@987654323 @ 将 lvalue 引用添加到表达式的类型,从而产生int&

【讨论】:

    猜你喜欢
    • 2015-09-23
    • 1970-01-01
    • 2019-09-28
    • 2016-08-13
    • 2015-06-17
    • 2011-10-05
    • 1970-01-01
    • 1970-01-01
    • 2015-06-07
    相关资源
    最近更新 更多