簡體   English   中英

boost :: signals :: scoped_connection在std :: vector中不起作用。 為什么?

[英]boost::signals::scoped_connection doesn't work in std::vector. why?

據我了解, scoped_connection旨在在超出范圍時自動斷開連接,而不是在斷開連接之前。 我發現,當scoped_connection位於std::vector時,這將無法正常工作(其他容器也可能會失敗)。

例如。

using boost::signals::scoped_connection; // just for readability
boost::signal<void ()> sig;
std::vector<scoped_connection> connection_vec;

connection_vec.push_back(sig.connect(foo));
assert(connection_vec.back().connected()); // this assertion fails!

我已經通過聲稱std::vector要求元素是可復制的,而scoped_connection是不可scoped_connection來解釋這一點-但這並非完全正確。 std::vector僅要求元素可移動 (我希望scoped_connection應該是可移動的。)

例如,以下代碼有效:

std::vector<std::unique_ptr<scoped_connection>> vec2;
// Note that std::unique_ptr is uncopyable, but moveable

vec2.push_back(std::unique_ptr<scoped_connection>(new scoped_connection(sig.connect(foo))));
assert((*vec2.back()).connected()); // this assertion succeeds!

此外,如果問題是由於std::vector試圖復制不可復制的內容而引起的,那該不會產生編譯錯誤嗎?

所以我想知道scoped_connectionvector內無法正常工作的真正原因是什么,這是可以在boost中解決的問題。

(我在帶有提升版本1.53.0的gcc版本4.8.0上對此進行了測試。)

scoped_connection還沒有移動構造函數。 因此它不能像您假設的那樣移動,而是std::move將回退以進行復制。 正如您提到的,您不能在scoped_connection周圍進行scoped_connection

您需要使用emplace_backpush_back副本。

暫無
暫無

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

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