左值参考是否经过左值到右值的转换?

时间:2016-07-11 18:06:16

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

表达式<中使用时,我一直认为引用会受到左值到右值转换的影响,就像任何其他 glvalue 一样/ em>的。然而,似乎每次在表达式中使用引用时,它都在[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中处理,正如我所期望的那样。这是为什么?

1 个答案:

答案 0 :(得分:2)

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

constexpr int j = r的情况下,是的,glvalue表达式r经历左值到右值的转换,因为这个初始化需要存储的值。虽然没有明确规定读取对象的存储值会调用左值到右值的转换,但在整个标准的上下文中,以及C标准中,这一事实显然必须是真实的。 &#34;右值&#34;没有使用,而是左值转换的类似概念是指将左值转换为&#34;存储在指定对象中的值&#34;。