c++ - 为什么函数参数总是左值?
问题描述
我无法理解 Scott Meyer 的 Effective Modern C++ 中的以下陈述......
特别重要的是要记住参数始终是左值,即使它的类型是右值引用。这是给定的
void f(Widget&& w);
参数 w 是一个左值,事件它的类型是 rvalue-reference-to-widget。
为什么参数 w 是左值,但它的类型是 rvalue-reference-to-widget?当人们说 w 是左值时,这是否意味着它的类型是左值类型?我可能错过了一些东西。
编辑:感谢那些评论的人......我仍然有点困惑。我想我不完全理解所涉及的这些概念的定义。什么是左值、右值、左值引用、右值引用?这些是 c++ 语言的上下文无关语法的一部分吗?这些与代码生成有什么关系吗?我能想到 c++ 上下文无关语法中的类型和值类别两个独立的生产规则吗?他们的意思是什么?
解决方案
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;
}
error: cannot bind rvalue reference of type 'Widget&&' to lvalue of type 'Widget'
但是 的值类别是w
左值。
以下表达式是左值表达式:(加粗我的)
变量、函数、模板参数对象 (C++20 起) 或数据成员的名称,与类型无关,例如 std::cin 或 std::endl。即使变量的类型是右值引用,由其名称组成的表达式也是左值表达式;
推荐阅读
- java - Apache Commons Imaging (EXIF):设置标签/标签缺失
- azure - 无法访问 Kudu (scm) 错误 403 - 此 Web 应用程序已停止
- ruby-on-rails - 仅具有宽度以保持比例的图像变体
- reverse-proxy - 将 Nginx 配置转换为 Haproxy
- mysql - 迁移到 MySQL8 后的连接问题
- javascript - 如何防止“MongoError:事务 1 已提交。”?
- sql - SQL - 在列中查找具有特定值组合的行
- python - TypeError 虽然形状相同:如果不是 (target.size() == input.size()): 'int' object is not callable
- spring - 请求被拒绝,因为在 tomcat 中部署 spring boot 应用程序时 URL 未规范化
- amazon-web-services - 如何使用 AWS CLI 根据给定的日期范围(如 8 月 8 日至 8 月 15 日)从 S3 存储桶下载选择性日期范围文件?