使用new创建类时会发生什么,然后执行该类的移动构造函数?原创作者是否仍有责任删除?下面的示例运行正常(http://ideone.com/rS2LR9),但是它不应该在第二个范围内崩溃,因为所有者在向量之前超出范围并因此删除了对象?
我显然在这里误解了一些东西,在std :: move之后所有权会发生什么?
#include <iostream>
#include <memory>
#include <vector>
#include <utility>
class Owner {
public:
Owner() : data_(new int(1)) {}
int& get() {return *data_;}
private:
std::unique_ptr<int> data_;
Owner(const Owner&) = delete;
void operator=(const Owner&) = delete;
};
int main()
{
{
Owner owner;
std::vector<int> test;
test.emplace_back(std::move(owner.get()));
std::cout << test[0] << std::endl;
}
{
std::vector<int> test;
{
Owner owner;
test.emplace_back(std::move(owner.get()));
}
std::cout << test[0] << std::endl;
}
{
Owner owner;
{
std::vector<int> test;
test.emplace_back(std::move(owner.get()));
std::cout << test[0] << std::endl;
}
}
}
答案 0 :(得分:2)
您没有在此处移动任何数据。当您致电Owner::get()
时,您正在公开对int
的引用,当您在该引用上调用std::move()
时,您正在进行一次微不足道的演员。 std::vector::emplace_back()
没有任何内容可以“偷走”Owner
,因为int
没有移动构造函数。
我猜你认为std::unique_ptr
里面的Owner
会参与这些操作,但事实并非如此;您正在取消引用该指针,但从不尝试移动其内容。为此,您必须调用std::unique_ptr
的移动构造函数或赋值运算符。