可以借助解引用操作变通地对 std::unique_ptr 进行深拷贝
ltimaginea opened this issue · 0 comments
ltimaginea commented
Lines 32 to 35 in c8787cf
课件这里的写法是复杂又容易出错的,其实我们可以采取下面这样更安全的方式:
//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;
其它的例证:
- Google tensorflow : unique_ptr - in copy assignment operator
- Microsoft terminal : unique_ptr - in copy constructor
- 《Effective Modern C++》,Item22,其中的 class Widget 的 copy constructor 和 copy assignment operator 的实现,见 EffectiveModernCppChinese/item22.md · GitHub