移動のみ型の Vector の初期化
G は、Vector の初期化で unique_ptr オブジェクトをコピーしようとしますが、コピー コンストラクターが原因で失敗します。アクセスできないこと。エラー メッセージは、コピー不可能なオブジェクトをコピーしようとする問題を正しく強調しています。
移動イテレータの使用
この問題を解決するには、移動イテレータを利用できます。逆参照時の要素:
using move_only = std::unique_ptr<int>; move_only init[] = { move_only(), move_only(), move_only() }; std::vector<move_only> v{std::make_move_iterator(std::begin(init)), std::make_move_iterator(std::end(init))};
ヘルパーの使用Type
または、ヘルパー型を利用して、初期化時に移動セマンティクスを実現できます。
template<class T> struct rref_wrapper { explicit rref_wrapper(T&& v) : _val(std::move(v)) {} explicit operator T() const { return T{std::move(_val)}; } T&& _val; }; // Only usable on temporaries template<class T> typename std::enable_if< !std::is_lvalue_reference<T>::value, rref_wrapper<T> >::type rref(T&& v) { return rref_wrapper<T>(std::move(v)); } std::initializer_list<rref_wrapper<move_only>> il{rref(move_only()), rref(move_only()), rref(move_only())}; std::vector<move_only> v(il.begin(), il.end());
以上がC で移動のみの型を使用してベクトルを初期化する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。