提问人:D.J. Elkind 提问时间:9/12/2023 更新时间:9/12/2023 访问量:82
为什么 C++ 中的移动语义在函数签名 [duplicate] 中有右值引用
Why move semantics in C++ have rvalue reference in function signature [duplicate]
问:
请考虑以下移动分配运算符:
class MyClass {
private:
ssize_t buf_size;
void* buf_ptr;
public:
MyClass &operator=(MyClass &&rhs) {
if (this != &rhs) {
buf_size = rhs.buf_size;
buf_ptr = rhs.buf_ptr;
rhs.buf_ptr = nullptr;
rhs.buf_size = -1;
}
return *this;
}
}
是什么阻止我们使用而不是作为方法的签名?据我了解,如果是左值,则所有引用都应该有效。&operator=(MyClass &&rhs)
&operator=(MyClass &rhs)
rhs
rhs
我可以看到一个问题:使用 makes copy assignment 运算符和移动赋值运算符看起来相同,我们无法确定要调用哪个运算符。但还有更深层次的原因吗?&operator=(MyClass &rhs)
答:
0赞
Sneftel
9/12/2023
#1
对于右值引用,没有比与左值引用不同的“更深层次的原因”了。自动确定引用是对左值还是右值,并执行正确的代码作为响应,是它们存在的全部原因。例如,不适用于采用左值引用的函数,因为临时值不是左值。myClass = MyClass{}
评论
auto_ptr
类,它使用左值引用作为其移动构造函数(因为右值引用尚不可用)。事实证明这不是一个好主意,即使它在技术上是可行的。