【发布时间】:2025-11-24 11:50:02
【问题描述】:
这个问题结合了unique_ptr as class member and move semantics fail to compile with clang和C++ std::vector in constructor。
我的目标是构建一个包装器
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 as class member and move semantics fail to compile with clang 中一样。
不幸的是,这导致了我制作std::vector<std::unique_ptr<AClass> >,用它来构造P_wrapper,最后用它来构造V_wrapper的相当不方便的构造过程。我觉得中间步骤应该是完全多余的!此外,它使界面更难阅读。包装器的重点首先是对用户隐藏vec 的实现,现在有一个莫名其妙的(不知道源代码)对象P_wrapper,它只用于构造另一个对象......
我想避免这种情况,并且只有一个包装器。有什么办法可以去掉中间人,这样我就可以回到V_wrapper的第一个更简单的实现?
【问题讨论】:
-
我知道这个问题真的很老,但我也遇到了同样的问题,只是想通了!
标签: c++ constructor wrapper stdvector unique-ptr