1

構築中にオブジェクトを移動するコンストラクターを含むクラスがあります。

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私の推測では、コンストラクターの引数は移動によって渡されるため、メソッド内のコンストラクターまでずっと転送されていません。

4

1 に答える 1