[conv]/6 中“表达式 e 用作泛左值当且仅当初始化将其用作泛左值”语句的确切含义是什么

Joh*_*ane 5 c++ language-lawyer c++14 c++17

[conv]/6(重点是我的):

任何隐式转换的效果都与执行相应的声明和初始化,然后使用临时变量作为转换的结果相同。如果 T 是左值引用类型或函数类型 ([dcl.ref]) 的右值引用,则结果为左值,如果 T 是对象类型的右值引用,则结果为 xvalue,否则为 prvalue。表达式 e 用作泛左值当且仅当初始化将其用作泛左值

在此特定段落的上下文中,上面突出显示的声明的含义是什么?

Col*_*mbo 2

该句子的目的是澄清,像i(wherei是变量) 这样的表达式不会在i立即转换为纯右值的上下文中被错误地视为左值。

例如,在

int main() {
  const int j = 0;
  constexpr int i = j;
}
Run Code Online (Sandbox Code Playgroud)

j如果将第二个定义视为左值,则其格式不正确,因为j它不是常量表达式的允许结果。然而,j被用作纯右值,因为初始化将其用作纯右值,因此链接段落中的其他规则适用(并且定义格式良好)。