首页 > 解决方案 > 为什么函数参数总是左值?

问题描述

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

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

void f(Widget&& w);

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

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

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

标签: c++c++11

解决方案


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;
}

https://godbolt.org/z/T616cq

error: cannot bind rvalue reference of type 'Widget&&' to lvalue of type 'Widget'

但是 的值类别w左值。

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

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


推荐阅读