曾幾何時,我假定這樣的代碼會失敗:Do * non * -const引用延長了臨時對象的生命嗎?
const MyClass& obj = MyClass();
obj.DoSomething();
因爲MyClass的對象將在其全表達的端部被破壞,留下OBJ作爲懸空參考。但是,我在這裏瞭解到這不是真的;該標準實際上有一個特殊的規定,允許const引用使臨時對象保持活動狀態,直到所有引用被自己銷燬。但是,有人強調,只有const引用纔有這種力量。今天,我將VS2012中的代碼作爲實驗運行。
struct Foo
{
Foo() { std::cout << "ctor" << std::endl; }
~Foo() { std::cout << "dtor" << std::endl; }
};
void f()
{
Foo& f = Foo();
std::cout << "Hello world" << std::endl;
}
輸出調用f()
當是:
ctor
Hello world
dtor
所以我不得不看看C++ 11標準草案,只發現這個(第12.2/4):
存在兩種情況,其中臨時數在 不同於完整表達式末尾的點處被銷燬。第一個上下文[不適用 ]。第二個上下文是當一個引用綁定到一個 臨時。引用所綁定到的臨時引用或引用綁定到的子對象的完整對象的臨時引用臨時引用的生存期保持不變。
上面顯然沒有字const
。所以;有這種行爲已被改變爲C + + 11,我是否錯開const
事情開始,或VS2012有一個錯誤,我只是沒有找到相關部分的標準?
,你允許右值綁定到一個非const的事實左值參考本身就是一個擴展。 – Brian
@Brian是不是我說的? – Praetorian
@Praetorian我的確如此。所以「只有const引用延長生命期」規則是其他規則的副作用,說明只有const引用可以綁定到rvalues? – dlf