6

重複の可能性:
initializer_list および move セマンティクス

このコードでは:

#include <vector>
#include <initializer_list>

template<typename T>
class some_custom_container : public std::vector<T>
{
public:
   some_custom_container(const std::initializer_list<T>& contents)
   {
      for (auto& i : contents)
        this->emplace_back(std::move(i));
   }
};

class test_class
{};

int main()
{
    test_class a;

    some_custom_container<test_class> i = { a, test_class(), a };
}

私がそれを理解していれば、すべてのオブジェクト{ a, test_class(), a }は安全に構築されています。名前付きオブジェクトがコピーされ、名前のないオブジェクトが移動されて、initializer_list が構築されます。その後、 thisinitializer_listは参照によってsome_custom_containerのコンストラクターに渡されます。

次に、無駄な二重コピーを避けるために、それらすべてを移動してベクトルを埋めます。

このコンストラクタは安全ですか?たとえば、T が参照 & または && として評価された場合など、奇妙な状況では、ベクトルは常に十分に満たされている (安全なオブジェクトを含む) でしょうか?

この場合、initializer_liststl コンテナーのコンストラクター実装がこのように実装されないのはなぜですか? 私が知っているように、それらのコンストラクターはコンテンツをコピーし、移動しません。

4

1 に答える 1

5

initializer_listconstその要素へのアクセスのみを提供します。を使用const_castしてそのコードをコンパイルすることもできますが、移動によって未定義の動作が発生する可能性があります (の要素initializer_listが本当に const の場合)。したがって、この移動を行うのは安全ではありません。本当に必要な場合は、これに対する回避策があります。

于 2012-12-19T17:26:29.373 に答える