2009-04-17 37 views
9

ハーブ・サッターのブログでthis articleを読んだ後、私はちょっと実験して、困惑するものに遭遇しました。私はVisual C++ 2005を使用していますが、これが実装に依存する場合は驚くでしょう。ここで一時的な参照の参照

が私のコードです:

#include <iostream> 

using namespace std; 

struct Base { 
    //Base() {} 
    ~Base() { cout << "~Base()" << endl; } 
}; 

int main() 
{ 
    const Base & f = Base(); 
} 

実行すると、それは「~Base()二回を表示します...しかし、私のコンストラクタをアンコメントしている場合、それだけで一度それを表示します!

誰でも説明がありますか?

答えて

24

これは実装によって異なります。

標準では、一時参照をconst参照にバインドするときにコピーが発生します。あなたの場合、VC++は、コンストラクタが暗黙的に定義されている場合にのみコピーを実行します。これは予想外ですが、許可されています。

C++ 1x will fix this

+0

すばらしい答え、ありがとうございましたサー: – Drealmer

+0

面白いです。この結果、場合によってはオブジェクトがスライスされますか? –

+0

"C++ 1xで修正されます。"ああああ、彼らは今、次の標準と呼んでいるのでしょうか、これは気の利いた冗談ですか? – veefu