我无法理解 Scott Meyer 的《Effective Modern C++》中的以下陈述...
特别重要的是要记住,参数始终是左值,即使其类型是右值引用。这是给定的
Run Code Online (Sandbox Code Playgroud)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;
}
Run Code Online (Sandbox Code Playgroud)
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。即使变量的类型是右值引用,由其名称组成的表达式也是左值表达式;
| 归档时间: |
|
| 查看次数: |
1294 次 |
| 最近记录: |