为什么函数参数总是左值?

use*_*897 5 c++ c++11

我无法理解 Scott Meyer 的《Effective Modern C++》中的以下陈述...

特别重要的是要记住,参数始终是左值,即使其类型是右值引用。这是给定的

void f(Widget&& w);
Run Code Online (Sandbox Code Playgroud)

参数 w 是一个左值,如果它的类型是 rvalue-reference-to-widget。

为什么参数 w 是左值,但其类型是 rvalue-reference-to-widget?当人们说 w 是左值时,是不是意味着它的类型是左值类型?我可能错过了一些东西。

编辑:非常感谢那些发表评论的人......我仍然有点困惑。我想我并不完全理解所涉及的这些概念的定义。什么是左值、右值、左值引用、右值引用?这些是 C++ 语言上下文无关语法的一部分吗?这些与代码生成有什么关系吗?我可以在 C++ 上下文无关语法中将类型和值类别视为两个独立的产生规则吗?他们的意思是什么?

Ton*_*ous 2

w正如您在错误消息中看到的那样,的类型是右值引用。

#include <iostream>
#include <utility>

class Widget {};

void f(Widget&& w)
{
    std::cout << "HERE " << std::endl;
    return;
}

int main()
{
    Widget ww;
    //f(std::move(ww));
    f(ww);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

https://godbolt.org/z/T616cq

error: cannot bind rvalue reference of type 'Widget&&' to lvalue of type 'Widget'
Run Code Online (Sandbox Code Playgroud)

然而 的值类别w左值。

以下表达式是左值表达式:(粗体是我的)

变量、函数、模板参数对象 (C++20 起) 或数据成员的名称,无论类型如何,例如 std::cin 或 std::endl。即使变量的类型是右值引用由其名称组成的表达式也是左值表达式