[英]C++ Pimpl Idiom Incomplete Type using std::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 需要刪除。
main
從make_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.