参见的设计与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++临时从double
创建int
类型的,具有值1
,那么该临时被传递给incr
并且ss
未被修改。为了防止这种意外的行为,语言被改变了,所以临时的(即未命名的变量)不能绑定到非const引用,因为非const引用参数通常意味着参数将被修改以将信息传回给呼叫者。如果暂时被创建,则主叫方丢失该信息,例如
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-reference:
void blah(const int& rr);
非常感谢大家。 – ihm 2012-07-10 03:58:25