这个问题将unique_ptr组合为类成员,并且移动语义无法使用构造函数中的clang和C ++ std :: vector进行编译。
我的目标是构造一个包装器
struct V_wrapper{
std::vector<std::unique_ptr<AClass> > vec;
V_wrapper(std::vector<std::unique_ptr<AClass> > v) : vec{std::move(v)} {}
};
不幸的是,该代码无法编译,因为编译器(clang Apple LLVM版本4.2)试图复制构造v
不支持的向量。另一方面,如果我为设计一个中间包装器std::unique_ptr<AClass>
,如下所示
struct P_wrapper{
std::unique_ptr<AClass> Ptr;
P_wrapper(std::unique_ptr<AClass>& p) : Ptr(std::move(p)) {}
};
并如下编写V_wrapper
struct V_wrapper{
std::vector<P_wrapper > vec;
V_wrapper(std::vector<P_wrapper > v) : vec{std::move(v)} {}
};
那我就没问题 我认为(强调),这样做的原因是向量的构造函数意识到您应该使用引用来移动而不是尝试复制,就像在unique_ptr中作为类成员一样,移动语义无法用clang编译。
不幸的是,这导致了我制作std::vector<std::unique_ptr<AClass> >
,使用它来构造P_wrapper
,并最终使用它来构造的相当不便的构造过程V_wrapper
。我觉得中间步骤应该是完全多余的!此外,它使界面更难以阅读。包装器的全部重点是向用户隐藏的实现vec
,现在有一个莫名其妙的(不知道源代码)对象P_wrapper
仅用于构造另一个对象。
我想避免这种情况,并且只有一个包装器。有什么办法可以减少中间人的工作,让我回到第一个更简单的实现上V_wrapper
吗?
不要随意使用大括号激励器;std::vector
有一个使用构造函数列表的构造函数。编写此代码的明显方法对我来说很好:
#include <memory> // for std::unique_ptr
#include <utility> // for std::move
#include <vector> // for std::vector
struct bar {};
struct foo
{
using vtype = std::vector<std::unique_ptr<bar>>;
foo(vtype v) : _v(std::move(v)) { }
private:
vtype _v;
};
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句