在表达式<中使用时,我一直认为引用会受到左值到右值转换的影响,就像任何其他 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中处理,正如我所期望的那样。这是为什么?
答案 0 :(得分:2)
在某些上下文中,发生左值到右值的转换是因为它明确指定在给定的上下文中发生(例如,对于三元条件运算符,请参阅here)。但它在第4节中列出,因此它是隐式标准转换;与所有其他隐式标准转换一样,它在需要时发生。例如,类型int
的glvalue在用作算术表达式的操作数时将被隐式转换为prvalue,因为它存储了值是必需的。
在constexpr int j = r
的情况下,是的,glvalue表达式r
经历左值到右值的转换,因为这个初始化需要存储的值。虽然没有明确规定读取对象的存储值会调用左值到右值的转换,但在整个标准的上下文中,以及C标准中,这一事实显然必须是真实的。 &#34;右值&#34;没有使用,而是左值转换的类似概念是指将左值转换为&#34;存储在指定对象中的值&#34;。