请参阅The Design and Evolution of C++,第 3.7 章,第 86 页,其中给出了以下示例:
void incr(int& rr) { rr++; }
void g()
{
double ss = 1;
incr(ss) // note: double passed, int expected
// (fixed: error in Release 2.0)
}
在 C++ 的第一个版本中,使用 valueint
创建了一个临时类型,然后该临时被传递给并且没有被修改。为了防止这种意外行为,更改了语言,以便临时(即未命名的变量)不能绑定到非常量引用,因为非常量引用参数通常意味着将修改参数以将信息传递回呼叫者。如果一个临时的被静默创建,调用者会丢失该信息,例如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!
}
如果一个非常量引用被允许绑定到一个临时对象,那么这个程序是危险的,因为get_ptr(err)
会创建一个临时对象int
,like get_ptr(int(err))
,并在临时对象中设置错误状态,所以err
即使出现问题,它仍然是零。
如果函数作者希望能够接受临时变量,因为参数不会用于将信息传递回调用者,那么函数可以按值获取参数:
void blah(int rr);
或通过常量引用:
void blah(const int& rr);