class A {
public:
int bar();
};
A foo() {return A();}
int A::bar() {return 5;}
を持っている。そして、私はこれを行うとしましょうか
class A {
public:
int bar();
};
A foo() {return A();}
int A::bar() {return 5;}
を持っている。そして、私はこれを行うとしましょうか
コードは次のとおりです。foo()
が呼び出されると
A foo() {return A();}
、効果の順序は次のとおりです。
A
のデフォルトコンストラクタを使用してA()
によって作成された一時的な。A
の戻り値オブジェクトは、ステップ1の一時的な引数(つまり、コンストラクタが存在する場合はそれを移動します。しかし、これはcopy elision状況なので、コンパイラは1にすべての3つのステップを組み合わせ、そしてA
のデフォルトコンストラクタを使用して戻り値オブジェクトを作成することができます。
戻り値オブジェクトには何が起こりますかは、呼び出しコードによって何が行われるかによって異なります。さらにコピーエリミッションが存在する可能性があります。用法:
int i = foo().bar();
何も起こりません。 bar()
が戻り値オブジェクトで呼び出され、値がi
に割り当てられ、戻り値オブジェクトが破棄されます。
C++ 11でコンパイルする場合、return A()
が実行されたときにfoo
の内部で、デフォルトのコンストラクタが呼び出されます。それからfooから返るときmove constructor
が呼び出されます。しかし、古いバージョンでコンパイルする場合は、最初にデフォルトのコンストラクタが呼び出され、コピーコンストラクタが呼び出されます。
デフォルトコンストラクタが呼び出されます。おそらく、これを明確にする:
#include <iostream>
using namespace std;
class A {
public:
A() {
cout << "A's default ctor" << endl;
}
};
int main() {
A a;
return 0;
}
質問は 'A foo(){return A();}に減らすことができます。 } '、残りのどれも関連はありません。そして、あなたはどちらのコンストラクタを思い浮かべますか?簡単に計測して調べるのは簡単です。あなたは得た結果に疑問を抱いていますか? – Barry
@Barryは、コピーelisionのために、テストによって必ずしも見つけにくいわけではありません –
私が知ったように - 私の問題はコピーelisionに起因していました。 –