構築中にオブジェクトを移動するコンストラクターを含むクラスがあります。
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
、単一のインスタンスを構築できるのと同じ方法で inplace のインスタンスを構築できると思いました。
の構築を可能にするために物事をどのように変更できるかについても説明してくださいstd::vector<SomeClass>
。
emplace_back
私の推測では、コンストラクターの引数は移動によって渡されるため、メソッド内のコンストラクターまでずっと転送されていません。