我的問題涉及如何返回沒有拷貝構造函數的對象。舉個例子,我們假設我有一些bigResource
位於堆中,我們假設我使用unique_ptr
來跟蹤它。現在假設我將這種資源的所有權交給毛蟲。然後我有一個CaterpillarWithBigResource
。現在在某個時候,這個CaterpillarWithBigResource
將變爲ButterflyWithBigResource
,因此Caterpillar
對象將不得不將所有權轉移給Butterfly
對象。如何返回沒有拷貝構造函數的對象
我寫了下面的代碼的情況型號:
#include <cstdlib>
#include <iostream>
#include <memory>
class ButterflyWithBigResource {
public:
// If I uncomment just this line, I get an error
// ButterflyWithBigResource(const ButterflyWithBigResource& other) = default;
// If I uncomment just this line, I get an error
// ButterflyWithBigResource(const ButterflyWithBigResource& other) = delete;
// With both above lines commented out, I get no errors, and the program runs fine.
ButterflyWithBigResource(std::unique_ptr<int>&& bigResource) :
bigResource(std::move(bigResource)) {
}
const int& getResource() {
return *bigResource;
}
private:
std::unique_ptr<int> bigResource;
};
class CaterpillarWithBigResource {
public:
CaterpillarWithBigResource(int bigResource) :
bigResource(new int(bigResource)) {
}
ButterflyWithBigResource toButterfly() && {
return ButterflyWithBigResource(std::move(bigResource));
}
private:
std::unique_ptr<int> bigResource;
};
/*
*
*/
int main(int argc, char** argv) {
CaterpillarWithBigResource caterpillarWithBigResource(5);
ButterflyWithBigResource butterflyWithBigResource(std::move(caterpillarWithBigResource).toButterfly());
std::cout << butterflyWithBigResource.getResource() << std::endl;
return 0;
}
注意,無論是Caterpillar
還是Butterfly
有默認的拷貝構造函數,因爲他們每個人都有一個unique_ptr
。然而,我不希望這是問題,所以只有移動構造函數纔是必要的。畢竟,我只是將所有權從Caterpillar
轉移到Butterfly
。
事實上,當我使用g++
版本4.8.2
編譯程序g++ -c -g -std=c++11 -MMD -MP -MF
它工作得很好。
但現在奇怪的是,如果我要提醒的是,Butterfly
的拷貝構造函數被刪除編譯器通過將線ButterflyWithBigResource(const ButterflyWithBigResource& other) = delete;
,程序不再編譯,編譯器抱怨的拷貝構造函數被刪除,這樣我可以在toButterfly
方法中不返回Butterfly
。
如果我然後試着告訴它,一切正常,而不是行ButterflyWithBigResource(const ButterflyWithBigResource& other) = default;
,我再次得到相同的錯誤。
我希望發生的是在toButterfly
方法構建的Butterfly
被轉移到toButterfly
的返回地址,再後來用作Butterfly
的說法「在main()
構建butterflyWithBigResource
時的舉動的構造。有沒有辦法做到這一點?
BTW,返回,沒有拷貝構造一個對象,你會使用複印通list-initialization:'return {std :: move(bigRes我們)}' – 0x499602D2