簡體   English   中英

C++ 又一個 unique_ptr 類型不完整的問題

[英]C++ another unique_ptr incomplete type question

在這里查看了各種類似的問題,但仍然無法弄清楚為什么以下代碼無法編譯:

// these three are defined somewhere
class A;
std::unique_ptr<A> make_a(); 
void take_a(std::unique_ptr<A>&&);

int main(){
   take_a(make_a()); // this fails
   return 0;
}

據此

如果使用默認刪除器,T 必須在代碼中調用刪除器的位置完成,這發生在 std::unique_ptr 的析構函數、移動賦值運算符和重置成員函數中。

據我了解,這些(析構函數、移動賦值運算符或重置成員函數)都沒有發生在main中。

那么為什么編譯器需要在這里定義A呢?

由於 main 在其作用域內有一個 unique_ptr,實際上它需要知道如何刪除它持有的對象。

有可能 take_a 實際上並未取得該對象的所有權,因此 main 需要刪除。

mainmake_a()得到一個臨時的unique_ptr ,我們稱它為X 然后它將對X的右值引用傳遞給take_a 它仍然具有 destroy X 因此,它必須在take_a之后調用析構函數,即使此時X通常為空。

我們需要類 A 描述(至少是構造函數和析構函數)才能創建和移動std::unique_ptr<A>對象; take_a(make_a())正在創建這樣的對象,因為make_a()是按值傳遞的。 它首先創建一個新的unique_ptr<A>對象,初始化它(使用默認構造函數),然后更新它的值並返回這個新對象。 這里使用了默認的構造函數/析構函數,編譯器無法找到它。

#include <bits/stdc++.h>

class A {
    public: A() {}
    public: ~A() {}
};

std::unique_ptr<A> make_a() {
    std::cout << "make";
    std::unique_ptr <A> tt = nullptr;
    return tt;
} 

void take_a(std::unique_ptr<A>&&) {
    std::cout << "take";
}

int main(){
   take_a(make_a()); // this works now
   return 0;
}

編輯:忘記添加鏈接 反之亦然

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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