私は次のように非常に単純なクラスを持っている:コピーコンストラクタがstd :: vectorのイニシャライザリストで呼び出されるのはなぜですか?
class Foo
{
public:
Foo() {}
Foo(const Foo&) = delete;
Foo(Foo&&) {}
void operator=(const Foo&) = delete;
void operator=(Foo&&) {}
void dump() const {}
};
クラスが構築可能と割り当て可能な移動ですが構築可能と割り当て可能なコピーではありません。
私はベクトルの初期化子リストを使ってFoo要素のベクトルを初期化したいと思います。
std::vector<Foo> vf = { Foo() };
コードでは、削除されたコピーコンストラクタを使用する必要があるため、コンパイラには不満があります。誰にも説明することができます、なぜこの構造では使用されていない、なぜオブジェクトのコピーが必要ですか?
次のようにもいずれかのコピーコンストラクタを必要と動作しません。一方
std::vector<Foo> vf = { std::move(Foo()) };
を、これは正常に動作(移動コンストラクタが呼ばれた)のための:
std::vector<Foo> vf;
vf.push_back(Foo());
感謝説明... :)
更新:
提案はthis投稿は私の質問を説明します。
さらに者は、(一緒に上記class Foo
と)、次のコードを考える:
class Bar {
public:
Bar(std::initializer_list<Foo> _l) {
std::cout << "Bar::Bar()" << std::endl;
for (auto& e : _l)
e.dump();
}
};
int main() {
Bar b { Foo() };
return 0;
}
これは、(C++ 11でコンパイルされた)次の出力を生成する:
Foo::Foo()
Bar::Bar()
Foo::dump()
Foo::~Foo()
それは見ることができ、イニシャライザーリストは実際には中括弧の間に記述された 'オブジェクトのコピー'で埋められていないことに注意してください。これはC++ 14では真実ではないかもしれません。
これはあなたが必要とするすべての説明があります。http://stackoverflow.com/questions/8193102/initializer-list-and-move-semantics – bolov
はい、それは説明しています。ありがとう。 – Peter