2013-06-11 18 views
9

ローカルオブジェクトへの参照を返す関数を記述しました。ローカルオブジェクトへの参照を返す関数

Fraction& operator*(Fraction& lhs, Fraction& rhs) 
{ 
    Fraction res(lhs.num*rhs.num,lhs.den*rhs.den); 
    return res; 
} 

関数の後にRESが破棄され、受信したオブジェクトは、それを使用して、未定義の動作につながる元フラクションオブジェクトをポイントするオブジェクトを返します。 この機能を使用する人は誰でも問題に直面します。

なぜコンパイラは、コンパイル時にエラーとしてこのような状況を検出することができないのですか?

+13

一般的にそれができる - '警告のようなもの印刷し++ G:ローカル変数への参照「X」' [デフォルトで有効に]返送します。使用しているコンパイラや使用したコンパイラスイッチに依存することがあります。 –

+2

これは何の警告であるか、すべての警告をエラーとして処理する時間です。 – yngccc

+0

定数参照で返すことができますし、それはうまくいくでしょう – dchhetri

答えて

19

ほとんどのコンパイラは、そのようにすると警告を表示します。あなたは常にGCCの-Wallのようなオプションで警告をオンにするべきです。

フロー制御機能は、それが困難な戻り値がローカルかどうかを参照しているかどうかを伝えることになりますので、誤差は標準で必要とされていない理由としては、それです。 (戻り値は、呼び出し元で使用されている場合は未定義の動作のみ発生します。)

+0

あなたはポインタの算術演算/作成なしでこのような "固く告げる"状況の例を挙げることができますか? – Elazar

+8

@Elazar確かに、 'return fn(local_var);'関数はローカル変数である引数への参照を返すかもしれません。あるいは 't&ref = flag?ローカル:グローバル;およびそれ以降は 'return ref;'。次に、コンパイラは 'flag'が' false'だった場合にのみ関数が(例外で終了するのではなく)返ることを証明しなければなりません。 – Potatoswatter

+0

コンパイラは、条件式を指し示す 'return ref'の警告を出すべきだと思います。これは「可能性あり」の分析です。 'return fn(local)'は別の話ですが、私は同意します。いい説明のために@Potatoswatterありがとう。 – Elazar

関連する問題