【发布时间】:2015-12-17 12:11:14
【问题描述】:
我正在阅读this 关于移动语义的回答并提出了一个问题。他描述了所谓的 move and swap 成语:
unique_ptr& operator=(unique_ptr source) // note the missing reference
{
std::swap(ptr, source.ptr);
return *this;
}
由于移动赋值运算符应该对 rvalue 引用进行操作,我认为将 rvalue 引用作为参数传递是可以接受的。这是一个例子:
#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语义。
你不能解释一下吗?
【问题讨论】:
-
我不确定您对 c++ 的掌握程度有多强,
*new T通常是不理解值语义的结果。你在现实生活中想要的是foo(A{});,但你当然可能知道,这只是学术性的。 -
*new A是一个左值。它指定存储对象的内存位置。要移动你必须写std::move(*new A)(这会泄漏内存) -
"
*new A",你怎么去delete那个A?
标签: c++ c++11 move-semantics