我一定義析構器就會得到這個錯誤,但不定義析構器就能編譯成功,但我很想定義析構器來除錯一些 seg 故障。
class Socket {
private:
seastar::output_stream<char> socket。
public:
std::string peer;
public:
Socket() = default;
template <typename...。Args>
explicit Socket(seastar: :output_stream<char> &&s, std::string p) : socket(std::move(s)), peer(p) {]
~Socket() {}。
std::cout << "Socket has gone out of scope"/span> << "
"。
}
seastar::future<> send(std::string message) {
co_await socket.write(message)。
co_await socket.flush()。
}
seastar::future<> close() {
co_await socket.close() 。
}
};
編譯失敗,
error: object of type 'Socket' cannot be assigned because its copy assignment operator is implicitly deleted
connection->second.socketObj = std::move(socketObj)。
^
./socketwrapper。 h:44:46: 注意。operator的復制賦值'Socket'被隱式洗掉,因為欄位'socket'有一個已洗掉的復制賦值operator。
seastar::output_stream<char> socket。
是否有辦法解決這個問題?
uj5u.com熱心網友回復:
添加
Socket(Socket& &)=default。
Socket& operator=(Socket&&)=default。
uj5u.com熱心網友回復:
這里的基本問題是 "當我明確使用std::move()時,為什么編譯器試圖使用一個復制賦值?"
所以讓我們看看一個簡單的、格式良好的例子:
struct MyStruct {
MyStruct()
: some_data(new int(12)>{}。
MyStruct(constMyStruct& other)
: some_data(new int(*other.some_data)){}。
MyStruct& operator=(constMyStruct& rhs) {
delete some_data;
some_data = new int(*rhs.some_data)。
return *this。
}
~MyStruct() {
delete some_data;
}
int * some_data;
};
MyStruct foo() {
return MyStruct()。
}
int main() {
MyStruct a;
a = foo(); //<--在這里復制賦值,沒有選擇。
}
很明顯,盡管這是一個RValue場景,但使用復制賦值是很重要的。
但是,為什么該程式首先是格式良好的呢?這是一個移動賦值設定,而我沒有移動賦值運算子。難道編譯器就不能給我一巴掌嗎?問題是,在C 11和移動語意出現之前,這就是良好的形式,所以它必須保持正確的行為。
因此,在存在任何其他建構式/分解函式/賦值運算子的情況下,如果沒有移動賦值/建構式存在,則應使用復制賦值/復制建構式 必須來代替,以防它恰好是很久以前撰寫的代碼。
對你來說,直接的修復方法是添加一個移動賦值運算子。在這一點上,它可能也有助于清理事情并完成完整的5規則。
class Socket {
private:
seastar::output_stream<char> socket。
public:
std::string peer;
public:
Socket() = default;
explicit Socket(seastar::output_stream<char> && s, std::string p)
: socket(std::move(s)), peer(p){}。
Socket(Socket&& ) = default;
Socket& operator=(Socket&&) = default;
//這些在技術上是多余的,但讀者不會知道,。
//所以明確一點也不錯。
Socket(const Socket& ) = delete;
Socket& operator=(const Socket&) = delete;
/ ...
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/306733.html
標籤:
下一篇:基類中的靜態方法反映派生類的名稱
