C++ 11复制作为成员的std :: unique_ptr的std :: vector

Æle*_*lex 0 vector copy-constructor unique-ptr c++11

我有一个graph有成员的班级:

std::vector<std::unique_ptr<layer>> _layers;
Run Code Online (Sandbox Code Playgroud)

我理解其性质std::unique_ptr是不可复制的.我的graph::graph(const graph & rhs);拷贝构造函数产生编译错误,因为我的普通实现违反了本质std::unique_ptr.

graph::graph(const graph & rhs)
: _layers(rhs._layers) {}
Run Code Online (Sandbox Code Playgroud)

如果我这样做,std::move那么我将违反param 的常量rhs,这不是我想要的.我知道我可以制作深层副本(例如,为存储的每个对象创建新的唯一指针rhs._layers)但除了迭代每个项目rhs._layers并分配新的唯一指针之外,还有一些优雅的方法吗?

gcc/g ++是c ++ 11而不是c ++ 14

我目前的解决方案是深度复制对象并分配新指针:

graph::graph(const graph & rhs)
{
   for (const auto & ptr : rhs._layers)
       _layers.emplace_back(std::unique_ptr<layer>(new layer(*ptr)));
}
Run Code Online (Sandbox Code Playgroud)

Bri*_*uez 5

最优雅的解决方案是使用STL:

graph::graph(const graph & rhs)
{
    _layers.reserve(rhs._layers.size());
    std::transform(
        std::begin(rhs._layers),
        std::end(rhs._layers),
        std::back_inserter(_layers),
        [](const std::unique_ptr<layer>& uptr) {
            return std::unique_ptr<layer>{uptr ? new layer{*uptr} : nullptr};
        });
}
Run Code Online (Sandbox Code Playgroud)

std::transform, std::back_inserter