人们一听就糊涂了
int&& x
x
具有右值引用类型,但 x
是左值。误解源于这样一个事实,即标识符和表达式是不同的东西,类型和值类别也是如此。此外,表达式的类型是“在任何进一步分析之前进行调整”,并且“rvalue”和“lvalue”这两个词可以出现在类型名称和值类别名称中。我想澄清正式的定义。假设我们有一个函数:
1 | void f(int&& x) {
2 | ... = x;
3 | ... = std::move(x);
4 | }
以下说法正确吗?
x
是命名函数参数的标识符(id 表达式)。它的类型是 int&&
,这是 decltype(x)
返回的类型。 x
不是表达式,也没有值类别。 x
是一个表达式。类型调整前,其类型为 int&&
,类型调整后为 int
。值类别是左值。 std::move(x)
是一个表达式。调整前的类型为 int&&
,调整后为 - int
。值类别是 xvalue。 x
具有右值引用类型时,我们要么将 x
的类型称为标识符,要么将 0x25181241 的类型称为调整之前的表达式类型。 x
或 T&
),则表达式为 l” he指的是调整前的类型,第二个字“lvalue”指的是值类别。 最佳答案
先说一些初步的段落:
现在,我们可以回答您的问题。
是的。声明中的 x
不是表达式。但是作为 decltype
的参数是一个表达式。但是,它遇到了 decltype
的第一个项目符号的特殊情况,因此推导出由 x
命名的标识符的类型,而不是 x
的类型作为表达式。
是的。
是的。
是的。
是的。
不能真正确定 Scott Meyers 在写这篇文章时的意思,但这是对符合标准的单词的唯一解释,是的。
关于c++ - 右值、左值和正式定义,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56716647/