c – std :: thread可移动,不可复制的参数
以下程序不会在VS11 beta,gcc 4.5或clang 3.1中构建
#include <thread> #include <memory> int main() { std::unique_ptr<int> p; std::thread th([](std::unique_ptr<int>) { },std::move(p)); th.join(); } 这是因为参数类型不可复制,但是实现尝试复制它. 据我所知,这个方案很好,应该有效. std :: thread的要求似乎意味着可移动,不可复制的参数应该在这里工作.具体来说,它可以指出可调用对象和每个参数应满足MoveConstructible要求,INVOKE(DECAY_COPY(std :: forward< F>(f)),DECAY_COPY(std :: forward< Args>(args))… )应该是一个有效的表达式. 在这种情况下,我认为表达式的作用如下: template <class T> typename std::decay<T>::type decay_copy(T&& v) { return std::forward<T>(v); } std::unique_ptr<int> p; auto f = [](std::unique_ptr<int>) {}; decay_copy(f)(decay_copy(std::move(p))); 我不认为这应该涉及一个p的副本. gcc至少可以编译这个表达式,虽然VS11没有. 我对我的要求有错误,论据必须是可复制的吗? 解决方法
N3337的第30.3.1.2段第3和4段:
所以是的,这应该是正常的.如果没有,那么这是你的实现中的一个错误. 请注意,新线程上将发生任何参数移动/复制.您正在将引用传递给另一个线程,因此您需要确保它们仍然存在,直到该线程启动. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |