我正在阅读 this回答关于 move 语义并提出问题。他描述了所谓的 move 和交换成语:
unique_ptr& operator=(unique_ptr source) // note the missing reference
{
std::swap(ptr, source.ptr);
return *this;
}
因为 move 赋值运算符应该对右值 引用进行操作,所以我认为将右值引用作为参数传递是可以接受的。这是一个例子:
#include <iostream>
struct A {
A(){ }
virtual ~A(){ }
A(A&&){ }
};
void foo(A a){
std::cout << "foo(A)" << std::endl;
}
int main()
{
foo(*new A);
}
但是编译器警告我它试图复制引用的对象但失败了,因为复制构造函数被删除了。我不明白为什么它在带有 unique_ptr
的示例中是正确的。当我们调用该函数时,该对象应该被复制,因此没有意义的 move 语义。
你能解释一下吗?
最佳答案
表达式 *(new A)
不是右值。
关于哪些表达式是右值的一般规则(不是 the actual rule,只是速记)是这样的:它要么是临时的,要么是您显式调用 std::move
的东西。并且 *(new A)
不是临时的。而且您没有对其调用 move
。所以它不是右值。
尝试使用 A()
代替。
关于c++ - move 语义和对象类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34326432/