這個問題在這里已經有了答案: 為什么右值參考變數不是右值? (3 個回答) 3天前關閉。
我在用一些代碼捏造,因為我認為我找到了另一個問題的解決方案。我正在寫一個小測驗程式,我讓它作業。但前提是我std::move()連續使用兩次。
這是示例代碼:
using namespace std;
class Serializable {
public:
virtual string serialize() = 0;
};
class Packet: public Serializable {
string payload;
public:
virtual string serialize() {
return payload;
}
Packet(string payload):
payload(payload) {
cout << "Packet made" << endl;
}
};
class Frame: public Serializable {
unique_ptr<Serializable> packet;
string head;
public:
virtual string serialize() {
return head packet->serialize();
}
Frame(string head, unique_ptr<Serializable>&& packet):
head(head), packet(move(packet)) { // Second Time
cout << "Frame made" << endl;
}
};
int main()
{
unique_ptr<Serializable> packet = make_unique<Packet>("World!");
Frame frame { "Hello ", move(packet)}; // First Time
cout<<frame.serialize();
return 0;
}
當我洗掉“第一個”(在 中main())時,我收到此錯誤:
main.cpp:49:29:錯誤:無法將“std::unique_ptr&&”型別的右值參考系結到“std::unique_ptr”型別的左值
當我洗掉另一個時,我收到此錯誤:
main.cpp:39:34:錯誤:使用已洗掉的函式 'std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = Serializable; _Dp = std::default_delete]'
我理解建構式中的那個,你不能復制一個unique_ptr. 但是里面的那個main()呢?我難住了。
uj5u.com熱心網友回復:
如果你這樣做:
Frame("", packet)
編譯器將嘗試將引數復制到 packet引數中 packet。如您所知,std::unique_ptr無法復制。即使您將其傳遞給引數,由于您無法復制,您需要將.std::unique_ptr
然后,在建構式中:
Frame(string head, unique_ptr<Serializable>&& packet) :
head(head), packet(move(packet)) {
...
}
這里將建構式引數移動std::move()到成員變數。由于我們不能復制,這也需要是一個移動操作。packetpacket
摘要:argument packet 移入建構式 parameter ,packet然后parameter 移入成員變數packet。所以我們需要做兩次移動操作。packet
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/532662.html
