1

次のコードContainerで型のオブジェクトから型のオブジェクトに変換しようとしているとコンパイラが考えるのはなぜですか? ブレース付きコンストラクターが変数MoveTestに転送されるのはなぜですか? move_thingsもちろん、をに置き換える{}()問題が解決します

#include <iostream>
#include <array>
using namespace std;

static constexpr int NUMBER{2};

class MoveTest {
public:
  MoveTest(const MoveTest&) {
    cout << "MoveTest(const MoveTest&)" << endl;
  }
  MoveTest(MoveTest&&) {
    cout << "MoveTest(MoveTest&&)" << endl;
  }
  MoveTest() {
    cout << "MoveTest()" << endl;
  }
};

class Container {
public:
  Container() = default;
  Container(Container&&) = default;
  Container(const Container&) = default;
  std::array<MoveTest, NUMBER> move_things;
};

int main() {
  Container container;
  __attribute__((unused)) Container another_one{std::move(container)};

  return 0;
}

私が得るエラーは次のとおりです

Could not convert ‘std::move<Container&>((* & container))’ from ‘std::remove_reference<Container&>::type {aka Container}’ to ‘MoveTest`

これは、統一された初期化構文が、? を持つクラスのオプションではなくなったことを意味しますstd::arrayか?

私が使用しているコンパイラとバージョンは

g++ (GCC) 4.8.5 20150623 (Red Hat 4.8.5-4)
4

0 に答える 0