9

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

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

関数が返された後、 res オブジェクトは破棄され、受信オブジェクトは Ex-Fraction オブジェクトを指し、それを使用すると未定義の動作が発生します。この機能を使用しようとしている人は誰でも問題に直面します。

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

4

1 に答える 1

19

これを行うと、ほとんどのコンパイラは警告を表示します。GCC の などのオプションを使用して、常に警告をオンにする必要があります-Wall

標準でエラーが必要とされない理由については、フロー制御を使用する関数では、戻り値がローカルを参照しているかどうかを判断するのが難しくなるためです。(また、未定義の動作は、戻り値が呼び出し元によって使用された場合にのみ発生します。)

于 2013-06-11T14:20:00.163 に答える