gpt4 book ai didi

c++ - 将std::unique_ptr插入std::set

转载 作者:行者123 更新时间:2023-12-02 10:12:45 29 4
gpt4 key购买 nike

将用std::unique_ptr制作的std::make_unique()插入std::set的最佳方法是什么? insert()emplace()都可以使用,但是哪个更好?

最佳答案

实现unique_ptr的方式(仅移动,而不是copy)可以防止您担心这种情况。但是创建其他人:

s.insert( std::make_unique<X>(1) ); // SAFE

auto p2 = std::make_unique<X>(2);
s.insert( std::move(p2) ); // also safe

auto p3 = std::make_unique<X>(3);
//s.insert( p3 ); // unsafe, compiler complains

s.emplace( std::make_unique<X>(4) ); // SAFE
auto p5 = std::make_unique<X>(5);
s.emplace( std::move(p5) ); // also safe

auto p6 = std::make_unique<X>(6);
//s.emplace( p6 ); // unsafe on exception, compiler will complain if you uncomment

auto p7 = std::make_unique<X>(7);
s.emplace( std::move(p7) ); // also safe
s.emplace( std::move(p7) ); // insert same agains also "safe", but inserts "null"
s.emplace( std::move(p2) ); // insert "null" again, but nulls are highlanders here
https://godbolt.org/z/3Gfoo7
不管您插入还是放置它,都始终通过移动语义发生,即使您使用 s.insert( std::make_unique<X>(1) )时也是如此。
在此示例中,3和6从未输入过该集合,即使像样例的最后两行p7或p2一样将其移动两次后,在插入/放置到集合中后它们也将为“null”。

关于c++ - 将std::unique_ptr插入std::set,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62959225/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com