2

私は過負荷の解決について何かを読んでいて、私を悩ませている何かを見つけました...次のコードで:

int const& MaxValue(int const& a, int const& b)
{
    return a > b ? a : b;
}

void SomeFunction()
{
    short aShort1 = 3;
    short aShort2 = 1;
    int const & r2 = MaxValue(aShort1, aShort2); // integral promotion
    //is it safe to pass r2 around before function SomeFunction completes
    // CallSomeOtherFunctionThatCallsSomethingElse(r2);

}

私の理解では、2つの一時的なintが作成され、SomeFunctionに属するスタックに割り当てられます。したがって、MaxValueが戻ると、r2はそれらの一時変数の1つ(この場合、値3を保持する変数)を参照します。したがって、r2を安全に渡すことができます。

問題は、私の理解が良ければ、これは標準的な動作ですか(確認してください)?そうでない場合は、上記のコードで何が起こっているのか説明してください。

どうもありがとう

4

4 に答える 4

4

暗黙のキャストがダメな理由へようこそ。これで、破棄された一時的なものへの参照があります。あなたがそれで何もしたくなかったことを望みます。

于 2010-07-04T15:04:40.463 に答える
3

はい、あなたの理解は良好であり、これは標準的な行動です。

これを除いて:

したがって、r2を安全に渡すことができます。

わかりません。

// 編集

同じことを問題なく達成するには、ここで参照の代わりにポインタを使用する必要があります。const参照によって渡された引数のアドレスを使用することは、オブジェクトのローカルコピーを指している可能性があるため、関数内でのみOKです。

于 2010-07-04T14:59:56.080 に答える
2

簡単な答え:それは安全ではありません。

この標準は、一時変数を定数参照にバインドできることを保証します。その場合、一時変数の寿命はバインドされた参照の寿命まで拡張されます。特定の場合の問題は、どの参照が実際に一時的なものをバインドしているかです。

を呼び出すとMaxValue( s1, s2 )、int型の2つの一時変数が作成され、パラメーター引数abinにバインドされますMaxValue。これは、それらの一時的なものの寿命が機能の完了まで延長されることを意味します。これで、関数のreturnステートメントで、一時的なものの1つへの2番目の参照を取得しており、その2番目の参照は有効期間を延長しません。r2オブジェクトの存続期間をさらに延長することはなく、ぶら下がっている参照があります。

個別のコンパイルのため、コンパイラはMaxValue、返された参照が引数の1つに対するものなのか、一時的ではない完全に異なるオブジェクトに対するものなのかを外部から知ることができない可能性があることに注意してください。

int const & OtherMaxValue( int const & a, int const & b ) {
   static int value = 0;
   value = (a > b? a : b);
   return value;
}

したがって、一時的なライフタイムのいずれかまたはどれを延長する必要があるかを推測することはできません。

ちなみに、小さなオブジェクト(すべての整数型など)の場合、参照による受け渡しは、実際には値による受け渡しよりも悪い場合があります。std::maxまた、この機能を実際に実装するテンプレートもすでにあります。

于 2010-07-04T15:44:50.687 に答える
1

単純型の場合は、値を返して渡す必要があります。

于 2010-07-04T15:30:17.523 に答える