-1

以下の関数定義は合法ですか?

T& GetMax(const T& t1, const T& t2)
{
    if (t1 > t2)
    {
        return t2;
    }
    // else 
    return t2;
}

「return ステートメントで、コンパイラは t1 または t2 を非 const に変換できないと不平を言うでしょう。」私はこのサイトでそれを読みました: http://www.codeproject.com/Articles/257589/An-Idiots-Guide-to-Cplusplus-Templates-Part-1

それは違法であることを意味しますか?使用例を教えてください。明確な説明をいただけますか?前もって感謝します

4

4 に答える 4

3

定義は問題ありません。t1この関数は、または以外の変数への参照を返すことができますt2t1コンパイラは、またはを返そうとした場合にのみ文句を言いますt2

于 2012-09-21T16:58:37.393 に答える
2

なぜそれは違法なのですか?関数は、引数を返すことを禁止されている間、グローバル状態を使用して戻ることができます。

int& foo(const int& a, const int& b)
{
    static int c = a + b;
    return c;
}

追加した

const制約に違反するため、引数の1つを返すことはできません。あなたはできる

  • 関数から値で返す
  • 非定数引数タイプを使用する

あなたの場合にnon-constを返すことが可能であれば、次のように書くことができます。

foo(5, 4) = 3;

意味がありません。

関数の終了時に破棄されるため、関数内で作成された一時的な自動変数への参照を返すこともできません。

于 2012-09-21T16:58:29.317 に答える
1

これは違法であり、コンパイラはエラー メッセージを表示します

その理由は、関数がconst戻り値の定義とは対照的な a を返すためです。つまり、戻り値が として定義されていないためconstです。ただし、問題があるのは署名ではありません。問題は return ステートメントにあり、これがコンパイラーが return ステートメントでエラーを出す理由です。

このように変更した場合:

const T& GetMax(const T& t1, const T& t2)
{
    if (t1 > t2)
    {
        return t2;
    }
    // else 
    return t2;
}

コードはエラーなしでコンパイルされます。ただし、この関数の外側にある場合は、次のようにします。

GetMax(x,y) = 0;

const (= 関数の戻り値) に値を割り当てているため、コンパイラはこの行で失敗します。

于 2012-09-21T17:33:02.750 に答える
-1

参照は通常ローカル変数に対するものであるため、参照を返すことは有効ですが、お勧めしません。通常は、「新規」にしたオブジェクトへのポインタを返しますが、呼び出し元はそのアイテムを削除する必要があります。フォーマットを使用する必要がある場合は、入力の1つのローカルクローンを作成し、代わりにそれを返す必要があります。

于 2012-09-21T16:58:27.553 に答える