2016-07-02 2 views
0

Visual Studio 2010コンパイラを使用していますが、このプログラムの出力を理解しようとしています。C++関数は破棄後有効な「参照」オブジェクトを返します

コード:

#include <iostream> 
using namespace std; 

class A 
{ 
public: 
    int i; 
    A() 
    { 
     i=0; cout<<"constructing A..\n"; 
    } 
    A(int a): i(a) 
    { 
     cout<<"constructing A with argument\n"; 
    } 
    A(A& a) 
    { 
     i=a.i; 
     cout<<"copy constructor\n"; 
    } 
    ~A() 
    { 
     cout<<"destructing a: " << i << endl; 
    } 
}; 

A& f(A b) 
{ 
    return A(25); 
} 

void main() 
{ 
    A m; 
    cout << "i = " << f(m).i << endl; 
} 

出力:破壊25

破壊引数で
を構築..
コピーコンストラクタ
を構築0
I = 25
destructing a:0

私の理解から、A(25)は参照によって返されて破棄されたので、なぜi: 'i = 25'の値を出力するのですか?

+3

あなたの顔には未定義の動作があります。定義されていない振る舞いの振る舞いについて質問するのはかなり役に立たない。 –

+2

紙に何かを書き込んでゴミ箱に投げ捨てると、数分後にあなたは一見してメモが残っています。どうして?その間に誰もあなたのごみ箱を空にしなかったからです。その紙の上に何か重要なものは何も持っていない方がいいでしょう。誰かがそれを別のものに置き換えることができました。未定義の動作を理解しようとするのは時間の無駄です。 – user463035818

答えて

0

プログラムに未定義の動作があります。それでも、生きていないオブジェクトが占有していたメモリはまだ上書きできないため、期待どおりの結果が得られます。

関連する問題