struct A {
A(int) : i(new int(783)) {
std::cout << "a ctor" << std::endl;
}
A(const A& other) : i(new int(*(other.i))) {
std::cout << "a copy ctor" << std::endl;
}
~A() {
std::cout << "a dtor" << std::endl;
delete i;
}
void get() {
std::cout << *i << std::endl;
}
private:
int* i;
};
const A& foo() {
return A(32);
}
const A& foo_2() {
return 6;
}
int main()
{
A a = foo();
a.get();
}
我知道,返回對本地值的引用是不好的。但是,另一方面,const引用應該擴展一個臨時對象的生命週期。將const引用返回給本地對象時發生了什麼?
此代碼產生一個UB輸出。所以沒有生命延伸。
爲什麼?我的意思是可以有人解釋一步一步發生什麼?
我的推理鏈中哪裏出錯?
FOO():
A(32) - 構造函數
返回A(32) - 一個常量引用本地對象創建並返回
A中的= foo(); - a由foo()返回值初始化,返回值超出範圍(超出表達式)並被銷燬,但a已經初始化;
(但實際上析構函數拷貝構造函數調用之前)
FOO_2():
返回6 - A型的臨時對象是隱式創建,const引用到這個對象(延長其壽命)並返回
A a = foo(); - a由foo()返回值初始化,返回值超出範圍(超出表達式)並被銷燬,但a已經初始化;
(但實際上析構函數拷貝構造函數調用之前)
「const引用應該擴展一個臨時對象的生命週期」< - erm,當涉及到對象生命週期非const並且const引用相等並且不*擴展它時。 – Giel 2012-07-31 19:36:47
我認爲這是亞歷山大談到延長生命的意義:http://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/ – vmpstr 2012-07-31 19:44:31
@Giel:沒有。Const參考**可以**延長臨時對象的生命週期。在處理臨時對象時,常量和非常量引用是完全不同的。在這種情況下,它的作用與OP所期望的不同。 – AnT 2012-07-31 19:45:04