【问题标题】:Is an lvalue reference subjected to an lvalue-to-rvalue-conversion?左值引用是否经过左值到右值的转换?
【发布时间】:2016-07-11 18:06:15
【问题描述】:

我一直认为,当在 表达式。尽管如此,似乎每次在 表达式 中使用引用时,都会在 [expr.const]/2 的项目符号点 (2.9) 中处理,而不是项目符号点 (2.7)(在 C++14 中,或 C++1z)。

以下面的引用r为例,用于初始化变量j。它是否经过左值到右值的转换

const int i = 1;
constexpr int& r = i
constexpr int j = r;

根据this answer,引用r 在[expr.const]/2 的项目符号点(2.9) 中处理,而不是在项目符号点2.7 中,正如我所料。这是为什么呢?

【问题讨论】:

  • [expr.const]/2 中的项目符号不会“处理”任何内容。为了使表达式成为核心常量表达式,需要满足每个项目符号。
  • 那为什么引用 r 不满足项目符号(2.7)?你能解释一下吗?我的意思是为什么 (2.7) 中的子项目之一不满意?
  • 每个子弹的哪一部分难以理解?你需要满足所有,而不是一个
  • 你看到我上面的编辑了吗?
  • 不管你是否满足2.7,你还是要满足2.9、2.10、2.11、2.12,等等……如果不满足2.9,那就不是核心常量表达式,无论是否满足 2.7。

标签: c++ c++14 language-lawyer constexpr c++17


【解决方案1】:

在某些上下文中,会发生左值到右值的转换,因为它被明确指定发生在给定的上下文中(例如,对于三元条件运算符,请参阅here)。但它在第 4 节中列出,因此它是一种隐式标准转换;像所有其他隐式标准转换一样,它会在需要时发生例如,当用作算术表达式的操作数时,int 类型的泛左值将被隐式转换为纯右值,因为它的存储值是必填。

constexpr int j = r 的情况下,是的,glvalue 表达式r 经历了左值到右值的转换,因为这个初始化需要存储的值。尽管没有明确规定读取对象的存储值会调用左值到右值的转换,但这一事实显然在整个标准以及 C 标准的上下文中都是正确的,其中术语“右值” "没有使用,而是类似的概念左值转换是指将左值转换为“存储在指定对象中的值”。

【讨论】:

    猜你喜欢
    • 2017-11-24
    • 1970-01-01
    • 2013-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多