人们一听就糊涂了

int&& x
x 具有右值引用类型,但 x 是左值。误解源于这样一个事实,即标识符和表达式是不同的东西,类型和值类别也是如此。此外,表达式的类型是“在任何进一步分析之前进行调整”,并且“rvalue”和“lvalue”这两个词可以出现在类型名称和值类别名称中。

我想澄清正式的定义。假设我们有一个函数:
1 | void f(int&& x) {
2 |     ... = x;
3 |     ... = std::move(x);
4 | }

以下说法正确吗?
  • 在第 1 行中,x 是命名函数参数的标识符(id 表达式)。它的类型是 int&& ,这是 decltype(x) 返回的类型。 x 不是表达式,也没有值类别。
  • 在第 2 行中,x 是一个表达式。类型调整前,其类型为 int&& ,类型调整后为 int 。值类别是左值。
  • 在第 3 行中,std::move(x) 是一个表达式。调整前的类型为 int&& ,调整后为 - int 。值类别是 xvalue。
  • 当我们说 x 具有右值引用类型时,我们要么将 x 的类型称为标识符,要么将 0x25181241 的类型称为调整之前的表达式类型。
  • cppreference.com处的“每个表达式都有一些非引用类型,每个表达式正好属于三个主要值类别之一”中的“类型”一词指的是类型调整后的类型。
  • 当 Scott Meyers writes “如果表达式的类型是左值引用(例如 xT&),则表达式为 l” he指的是调整前的类型,第二个字“lvalue”指的是值类别。
  • 最佳答案

    先说一些初步的段落:



    现在,我们可以回答您的问题。



    是的。声明中的 x 不是表达式。但是作为 decltype 的参数是一个表达式。但是,它遇到了 decltype 的第一个项目符号的特殊情况,因此推导出由 x 命名的标识符的类型,而不是 x 的类型作为表达式。



    是的。



    是的。



    是的。



    是的。



    不能真正确定 Scott Meyers 在写这篇文章时的意思,但这是对符合标准的单词的唯一解释,是的。

    关于c++ - 右值、左值和正式定义,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56716647/

    10-13 07:01