需要迈耶斯有效C++小部件右值示例解释
Need Meyers Effective C++ Widget rvalue example explanation
我有一个C++的问题。
在《有效的现代C++》的第一页上,有一个例子:
class Widget {
public:
Widget(Widget&& rhs);
};
此外,还有一个注释:"rhs 是一个左值,尽管它有一个右值引用类型"。
老实说,我什么都不懂。"rhs 是一个左值,但它的类型是右值引用"是什么意思?
请记住
,这里有两件不同的事情:
一个与变量的类型有关:有两种类型的引用:左值引用(
&
)和右值引用(&&
)。这决定了函数优先接受什么,并且始终是"显而易见的",因为您可以从类型签名中读取它(或使用
decltype
)。
另一个是表达式(或值)的属性:表达式可以是左值或右值(实际上,它比这更复杂......
此属性不会直接在代码中显示(但有一个经验法则,见下文),但您可以在重载分辨率中看到它的效果。 特别
- 左值参数
- 更喜欢绑定到左值引用参数,而 右值参数
- 更喜欢绑定到右值引用参数。
这些属性密切相关(在某种意义上彼此"双重"),但它们不一定彼此一致。 特别是,重要的是要认识到变量和表达式实际上是不同的东西,所以从形式上讲,它们甚至没有可比性,"苹果到橙子"。
C++有这样的规则,即使您已将rhs
声明为右值引用(意味着它将优先匹配右值参数),在移动构造函数块中,变量rhs
本身仍将表现为左值,从而优先匹配接受左值引用的函数。
void test(Widget&&) { std::cout << "test(Widget&&): calledn"; }
void test(Widget&) { std::cout << "test(Widget&): calledn"; }
Widget::Widget(Widget&& rhs) {
// here, `rhs` is an lvalue, not an rvalue even though
// its type is declared to be an rvalue reference
// for example, this will match `test(Widget&)`
// rather than the `test(Widget&&)` overload, which may be
// a bit counter-intuitive
test(rhs);
// if you really want to match `test(Widget&&)`
// you must use `std::move` to "wrap" the variable
// so that it can be treated as an rvalue
test(std::move(rhs));
}
这样做的基本原理是防止移动构造函数中的意外移动。
一般的经验法则是:如果表达式有一个名称(即由单个命名变量组成),那么它是一个左值。 如果表达式是匿名的,则它是右值。 (正如dyp所指出的,这在技术上是不正确的 - 请参阅他的评论以获取更正式的描述。
简短的解释:P
Widget(Widget&& rhs);
是一个移动构造函数。它将接受右值作为参数。在移动构造函数的定义中,您可以使用名称 rhs 引用另一个 Widget,因此它是一个左值。
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 最小硬币更换问题(自上而下方法)
- Qt VTK交互风格的信号到小部件
- 请解释"函数1(p1,p2,p3);"的输出
- 芬威克树(BIT).找到具有给定累积频率的最小索引,单位为 O(logN)
- 如何在Qt窗口小部件中使用QStringView(或QStringRef)
- 使用递归的数组的最小值.这是怎么回事
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 为什么在浮点中从大到小会引入更多的误差
- 找到两对数字,使它们的乘积的绝对差最小化
- 被解释为低级别const的const对象的地址
- 计算每个节点的树高,帮助我解释这个代码解决方案
- MSVC将仅移动结构参数解释为指针
- 写一个最小的自定义操作员:std :: Sort需要std :: __ lg为我的类型解释
- 最小堆需要解释
- C++ 创建小部件数组
- 最小平均重量周期 - 直观的解释
- 需要迈耶斯有效C++小部件右值示例解释
- FFTW3:解释fftw_plan_r2c_1d输出并访问输出的虚部
- 解释boykov_kolmogorov_max_flow最小切割组