[英]Dereference operator on temporary object
在這樣的代碼中
#include <iostream>
#include <memory>
struct A {
int i;
A() {
std::cout << "A()" << std::endl;
}
~A() {
std::cout << "~A()" << std::endl;
}
};
void f(const A& a) {
std::cout << "f(A)" << std::endl;
}
std::unique_ptr<A> make_a() {
return std::make_unique<A>();
}
int main() {
f(*make_a());
}
是否保證只有在執行f()
后才會刪除A
object?
是的,保證在完整表達式之后臨時將被銷毀,其中包括調用 function f()
。
作為評估完整表達式的最后一步,所有臨時對象都被銷毀,該完整表達式(詞法上)包含創建它們的點,如果創建了多個臨時對象,它們將按照與創建順序相反的順序被銷毀。 即使評估以拋出異常結束也是如此。
對,那是正確的。 C++ 標准明確指出,所有作為 function 參數傳遞的匿名臨時對象在 function 調用中仍然存在。
object 將在評估完整表達式f(*make_a());
一旦它們所涉及的完整表達式結束,臨時對象就會被破壞。
在您的情況下,完整表達式是f(*make_a())
,這意味着一旦對f
的調用完成(在 function f
返回之后), object 將被破壞。
是否保證只有在執行 f() 后才會刪除 A object?
C++ 標准保證所有臨時對象在整個表達式(以分號;
結尾的表達式)的評估結束之前都存在。 有關完整詳細信息,請參閱Lifetime :
作為評估完整表達式的最后一步,所有臨時對象都被銷毀,該完整表達式(詞法上)包含創建它們的點,如果創建了多個臨時對象,它們將按照與創建順序相反的順序被銷毀。 即使評估以拋出異常結束也是如此。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.