3

参考文献に関するウィキペディアのページを読んでいます。

次のコードが含まれています。

int& preinc(int& x) 
{ 
    return ++x;  // "return x++;" would have been wrong
}

preinc(y) = 5; // same as ++y, y = 5

return x++;代わりに を使用してコンパイルしようとしましたreturn ++x;。予測どおり、これにより次のエラーが発生しました。

エラー: タイプ 'int' のテンポラリからのタイプ 'int&' の非 const 参照の無効な初期化</p>

このエラーがわかりません。x のインクリメントが遅すぎる (つまり、preinc の関数呼び出しが終わった後) という漠然とした直感があります。ただし、変数 x が存在しなくなることはないため、これがどのように問題になるかはわかりません。どんな説明でも大歓迎です。

4

3 に答える 3

7

エラーの原因は、ポスト インクリメントx++が一時的な値を返し、これが非 const 左辺値参照にバインドできないことです。これは、同じ問題の単純化されたバージョンです。

int i = 42;
int& j = i++; // Error: i++ returns temporary value, then increments i.
const int& k = i++; // OK, const reference can bind to temporary.
于 2013-08-03T15:47:41.533 に答える
0

プリインクリメント( ++i) はインクリメントを行い、変数への参照を返します (変更されています)。ポストインクリメント (i++) はインクリメントの結果を計算し、それを一時ローカル変数に格納し、インクリメントを行った後にその結果のコピーを返します。これは、呼び出し後にインクリメントが行われたように見せるために行われます。

int operator++(int)
{
   int tmp( *this );
   ++(*this);
   return tmp;
}  

このコードは学習用であり、実際のコードではありません (int はクラスではありません)。ポストインクリメントがどのように機能するかを示すためのものです。

ご覧のとおり、参照でi++はなくコピーを返します。そのため、既存の変数への参照ではなく右辺値であるため、戻り値を初期化することはできません。

于 2013-08-03T15:51:38.273 に答える
0

x を返す前にインクリメントして、問題が解決するかどうかを確認できます。

int& preinc(int& x) 
{ 
    x++;
    return x;  // "return x++;" would have been wrong

}
于 2013-08-03T15:52:28.047 に答える