2016-08-10 15 views
0

のは、私はオブジェクトこの場合、どのようなコンストラクタが呼び出されますか?</p><code>foo()</code>戻って作成された一時的な値のために呼び出されたどのようなコンストラクタ <pre><code>int i = foo().bar(); </code></pre> <p>:?

class A { 
    public: 
    int bar(); 
}; 

A foo() {return A();} 
int A::bar() {return 5;} 

を持っている。そして、私はこれを行うとしましょうか

+3

質問は 'A foo(){return A();}に減らすことができます。 } '、残りのどれも関連はありません。そして、あなたはどちらのコンストラクタを思い浮かべますか?簡単に計測して調べるのは簡単です。あなたは得た結果に疑問を抱いていますか? – Barry

+0

@Barryは、コピーelisionのために、テストによって必ずしも見つけにくいわけではありません –

+0

私が知ったように - 私の問題はコピーelisionに起因していました。 –

答えて

1

コードは次のとおりです。foo()が呼び出されると

A foo() {return A();} 

、効果の順序は次のとおりです。

  1. Aのデフォルトコンストラクタを使用してA()によって作成された一時的な。
  2. コピー/移動コンストラクタを使用して作成されたAの戻り値オブジェクトは、ステップ1の一時的な引数(つまり、コンストラクタが存在する場合はそれを移動します。
  3. ステップ1からの一時的なものが破棄されます。

しかし、これはcopy elision状況なので、コンパイラは1にすべての3つのステップを組み合わせ、そしてAのデフォルトコンストラクタを使用して戻り値オブジェクトを作成することができます。

戻り値オブジェクトには何が起こりますかは、呼び出しコードによって何が行われるかによって異なります。さらにコピーエリミッションが存在する可能性があります。用法:

int i = foo().bar(); 

何も起こりません。 bar()戻り値オブジェクトで呼び出され、値がiに割り当てられ、戻り値オブジェクトが破棄されます。

0

C++ 11でコンパイルする場合、return A()が実行されたときにfooの内部で、デフォルトのコンストラクタが呼び出されます。それからfooから返るときmove constructorが呼び出されます。しかし、古いバージョンでコンパイルする場合は、最初にデフォルトのコンストラクタが呼び出され、コピーコンストラクタが呼び出されます。

0

デフォルトコンストラクタが呼び出されます。おそらく、これを明確にする:

#include <iostream> 

using namespace std; 

class A { 
public: 
    A() { 
    cout << "A's default ctor" << endl; 
    } 
}; 

int main() { 
    A a; 
    return 0; 
} 
関連する問題