【问题标题】:Adding struct items containing a unique_ptr to an stl container将包含 unique_ptr 的结构项添加到 stl 容器
【发布时间】:2013-11-01 13:55:05
【问题描述】:

我有两个匹配向量 unique_ptr。我决定通过制作一个包含两个unique_ptr 的结构向量来统一它们(该结构最终还将包含其他项目,因此进行了重构)。

在此向量中添加新项目的最佳方法是什么?

我当前的代码是

std::vector<DestinationObjects> destinations;
for (unsigned short &id: ids) {
    DestinationObjects d;

    d.transmitter = unique_ptr<Transmitter> (new Transmitter(id));
    d.controller = unique_ptr<Controller> (new Controller(id));

    destinations.push_back(d);
}

当然,这会复制d,从而导致unique_ptr 出现问题。解决此问题的最佳方法是什么?

我能想到的选项,其中一些我不确定是否可行:

  1. 只需切换到shared_ptr。 (一个简单的查找替换,但感觉像是在逃避)。
  2. 为移动 unique_ptr 的结构编写移动构造函数。 (当我扩展结构时,要维护的另一件事可能会出错)。
  3. 为 unique_ptr 推回一个带有空指针的空结构实例,并在向量中就地编辑这些实例。 (繁琐的语法。我也不确定这是否可行)。

有什么想法是另一种方法吗?或者为什么我应该更喜欢我列出的其中之一?

【问题讨论】:

  • 您认为您的代码会导致unique_ptr 出现什么问题?
  • 隐式移动构造函数应该没问题,除非您出于某种原因通过编写自己的复制构造函数将其杀死。无论如何,该类型必须是可移动的,因为 vector 在重新分配时需要移动对象。
  • 只是...移动它?或者更好的是,让自己成为一个像 boss 和 emplace_back 这样的构造函数。
  • @Oswald:不能复制,所以push_back(d)会编译失败。
  • @MikeSeymour 啊哈!我认为我目前正在测试的编译器无法编写隐式移动构造函数(VC11)。见这里:stackoverflow.com/questions/10201659/…

标签: c++ c++11 vector struct


【解决方案1】:

简单地做一个vec.emplace_back( std::move(d) )

如果(如您的评论中所述)您的编译器没有实现隐式移动构造函数,请编写您自己的 move 构造函数。我以后的建议是,每当您对任何 C++11 功能有疑问并提出问题时,请提及您正在使用此编译器,因为它很有可能是“C++11 支持”一个重要的问题。

如果您的编译器根本不支持任何移动构造函数,请停止使用 unique_ptr - 如果没有 move 构造函数,它们将毫无用处。 ;)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-02
    • 2013-10-23
    • 2018-09-30
    • 1970-01-01
    相关资源
    最近更新 更多