parallel101/course

可以借助解引用操作变通地对 std::unique_ptr 进行深拷贝

ltimaginea opened this issue · 0 comments

course/02/19/main.cpp

Lines 32 to 35 in c8787cf

C *raw_p = p.get();
func(std::move(p));
raw_p->do_something(); // 正常执行,raw_p 保留了转移前的指针

课件这里的写法是复杂又容易出错的,其实我们可以采取下面这样更安全的方式:

//C* raw_p = p.get();	// no need
func(std::make_unique<C>(*p));	// deep copy
p->do_something();	// OK, run normally

虽然 std::unique_ptr 删除了 copy constructor 和 copy assignment operator ,但其实我们可以借助解引用操作变通地对 std::unique_ptr 进行拷贝。

deep copy 示例如下:

std::unique_ptr<std::string> up1(std::make_unique<std::string>("Good morning"));

// copy construct!
std::unique_ptr<std::string> up2(std::make_unique<std::string>(*up1));
// safe copy construct!
std::unique_ptr<std::string> up3(up1 ? std::make_unique<std::string>(*up1) : nullptr);
// copy assignment!
up2 = std::make_unique<std::string>(*up1);
// safe copy assignment!
up3 = up1 ? std::make_unique<std::string>(*up1) : nullptr;

其它的例证: