我有一个包含构造函数的类,该构造函数在构造过程中移动对象:
class SomeClass
{
private:
const std::unique_ptr<Base> foo;
public:
template <typename T>
inline explicit SomeClass(T&& derived) noexcept
: foo(std::make_unique<T>(derived))
{
static_assert(std::is_base_of<Base, T>::value);
}
};
当我只需要一个实例时,可以毫无问题地构造类的对象:
class Derived : public Base
{
// ...
};
Derived bar(...);
SomeClass baz(std::move(bar));
// Or
SomeClass baz(Derived(...));
但是,我无法将 SomeClass 类型的任何对象放置(或推送)到std::vector<SomeClass>
.
std::vector<SomeClass> vec;
Derived bar(...);
vec.emplace_back(std::move(bar)); // Does not work.
vec.emplace_back(Derived(...)); // Does not work.
请你解释一下为什么不能放置物体?我认为使用的完美转发emplace_back
将允许以SomeClass
与可以构造单个实例相同的方式构造就地实例。
请您还可以解释一下如何修改事物以允许构建 astd::vector<SomeClass>
吗?
我的猜测是,由于构造函数参数是通过 move 传递的,因此它们不会一直转发到方法中的构造函数emplace_back
。