參見的設計與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