2017-09-12 4 views
2

現在のC++標準では、次の場合の要件は何ですか?このコードでコピーまたは移動コンストラクタを呼び出す必要があります

我々は次のコードがあるとします。

#include <iostream> 

struct Foo 
{ 
    Foo() { std::cout << "Foo::Foo()" << std::endl; } 
    Foo(Foo&) { std::cout << "Foo::Foo(Foo&)" << std::endl; } 
    Foo(Foo&&) { std::cout << "Foo::Foo(Foo&&)" << std::endl; } 
    ~Foo() { std::cout << "Foo::~Foo()" << std::endl; } 
}; 

struct Bar 
{ 
    Foo foo; 
}; 

int main() 
{ 
    Bar instance{ Foo{} }; 
} 

は、任意の実装は、標準に従って、ここで何をすべきでしょうか?コンストラクタのコピーと移動の両方が存在する必要があります(削除されません)。どちらを呼びますか?

+0

可能な重複:あなたはコピーの初期化をオプトアウトと直接初期化を行う場合はさておき、あなたが移動の両方を削除することができますし、同様にC++ 14でc'torsをコピーとして


[コピーエリッションと戻り値の最適化とは何ですか?](https://stackoverflow.com/questions/12953127/what-are-copy-elision-and-return-value-optimization) –

答えて

3

Foo{}はprvalueであり、コピー初期化を実行するので、回答は使用している標準リビジョンによって異なります。

C++ 14では、移動可能であり削除できないことが必要です。実際の動きはおそらく省略されます。

C++ 17は、メンバーfooを直接初期化するため、コピーと移動の両方が存在していなくてもアクセス可能である必要はありません。

#include <iostream> 

struct Foo 
{ 
    Foo() { std::cout << "Foo::Foo()" << std::endl; } 
    Foo(Foo&) = delete; 
    Foo(Foo&&) = delete; 
    ~Foo() { std::cout << "Foo::~Foo()" << std::endl; } 
}; 

struct Bar 
{ 
    Foo foo; 
}; 

int main() 
{ 
    Bar instance{ {} }; 
} 
+1

C++ 14では、コピーや移動のいずれかが必要なだけで、具体的に移動しませんか? –

+0

コピーコンストリクターはどうですか?その後、それを削除することはできますか? – FrozenHeart

+1

@DanielH - あなたは過負荷の解決で選ばれるものが必要です。それが動いている。 – StoryTeller

関連する問題