ホームページ >バックエンド開発 >C++ >C で移動のみの型を使用してベクトルを初期化する方法

C で移動のみの型を使用してベクトルを初期化する方法

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-23 21:31:11993ブラウズ

How to Initialize a Vector with Move-Only Types in C  ?

移動のみ型の 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。