1. ホーム
  2. c++

[解決済み] 移動専用型のベクターをリスト初期化できますか?

2022-09-30 18:52:30

質問

GCC 4.7のスナップショットに次のコードを渡すと、それは unique_ptr をベクターにコピーしようとします。

#include <vector>
#include <memory>

int main() {
    using move_only = std::unique_ptr<int>;
    std::vector<move_only> v { move_only(), move_only(), move_only() };
}

明らかに、これは動作しません。 std::unique_ptr はコピーできないからです。

error: deleted function 'std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = int; _Dp = std::default_delete; std::unique_ptr<_Tp, _Dp> = std::unique_ptr]'を使用することで、削除することができます。

GCCはイニシャライザーリストからポインターをコピーしようとしているのは正しいですか?

どのように解決するのですか?

のあらすじは <initializer_list> の概要は、初期化リストの要素が常にconst-referenceを介して渡されることを合理的に明確にしています。残念ながら、現在の言語のリビジョンでは、イニシャライザーリストの要素でmove-semanticを使用する方法はないようです。

具体的には

typedef const E& reference;
typedef const E& const_reference;

typedef const E* iterator;
typedef const E* const_iterator;

const E* begin() const noexcept; // first element
const E* end() const noexcept; // one past the last element