![](/img/trans.png)
[英]Is it safe to use a boost::signals2::scoped_connection object as member of a class for automatic connection lifetime?
[英]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_connection
在vector
內無法正常工作的真正原因是什么,這是可以在boost中解決的問題。
(我在帶有提升版本1.53.0的gcc版本4.8.0上對此進行了測試。)
scoped_connection還沒有移動構造函數。 因此它不能像您假設的那樣移動,而是std::move
將回退以進行復制。 正如您提到的,您不能在scoped_connection
周圍進行scoped_connection
。
您需要使用emplace_back
和push_back
副本。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.