簡體   English   中英

臨時 object 上的取消引用運算符

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM