2010-11-26 16 views
9
struct my 
{ 
    my(){ std::cout<<"Default";} 
    my(const my& m){ std::cout<<"Copy";} 
    ~my(){ std::cout<<"Destructor";} 
}; 

int main() 
{ 
    my m(); //1 
    my n(my()); //2 
} 

予想される出力:コンストラクタ呼び出しメカニズム

1) Default 
2) Copy 

実際の出力:


コンストラクタ呼び出しメカニズムの私の理解が間違っているのですか?

Note私は簡潔にするためにヘッダーファイルを省略しました。

答えて

11

ケース1)

mは、関数の戻りmyと引数を取っていないと解釈されます。期待される出力がmy m;

ケース2を使っすなわち()を削除するには、参照 )

これは、より良い「ほとんどの厄介な解析」として知られているものです。

nは、引数を取らないmyを返す関数へのポインタ型を引数にとり、myを返す関数として解釈されます。

は、この場合に予想される出力は my n((my()));

私の解釈[代わりに、前者の場合のように、引数の指定として処理するコンパイラは、今あるため、余分な()の表現としてそれを解釈するの]みてください表示するには:

my n((my()))は、my n = my()に相当します。私はないです。今

[ので、いくつかのcompiler optimizationのコピーctorのへの呼び出し] PSを右辺値式my()は一時的[すなわちデフォルトコンストラクタへの呼び出し]を作成していないとnは、その一時的なオブジェクトに初期化コピーです私の答えの最後の部分について100%確信しています。私が間違っているなら、私を訂正してください。

+1

RVOとは呼ばれませんが、実際には一般的な最適化です。 – MSalters

+3

@MSalters:はい、これはRVOの変種だと思います。 :) –

1

Prasoonのように、私はC++コンパイラが期待していない方法でコードを解析していると思われます。例えば、私はそれがない変数宣言と、関数プロトタイプ宣言としてライン

my m(); 

を解析し、コンストラクタにコールしていると思います - あなたは何も出力を見ていないので、なぜ。

関連する問題