The Design and Evolution of C++、第 3.7 章、p86 を参照してください。この例が示されています。
void incr(int& rr) { rr++; }
void g()
{
double ss = 1;
incr(ss) // note: double passed, int expected
// (fixed: error in Release 2.0)
}
C++ の最初のバージョンでは、型のテンポラリがからvalueでint
作成され、そのテンポラリは に渡され、変更されませんでした。この種の予期しない動作を防ぐために、言語が変更され、一時変数 (つまり、名前のない変数) が非 const 参照にバインドできなくなりました。発信者。一時が黙って作成された場合、呼び出し元はその情報を失います。double
1
incr
ss
void* get_ptr(int& error); // sets error=0 if returned pointer is valid
void g()
{
unsigned err = 0; // oops, wrong type
void* p = get_ptr(err); // uh-oh, error status stored in temporary
if (err == 0) // condition always true
use_ptr(p); // uh-oh! pointer may not be valid!
}
const 以外の参照がテンポラリにバインドできる場合、このプログラムは危険です。なぜなら、 のようなget_ptr(err)
テンポラリが作成され、テンポラリにエラー ステータスが設定されるため、問題があってもゼロのままになるからです。int
get_ptr(int(err))
err
引数は呼び出し元に情報を返すために使用されないため、関数の作成者が一時変数を受け入れることができるようにしたい場合、関数は値によってパラメーターを受け取ることができます。
void blah(int rr);
または const 参照によって:
void blah(const int& rr);