C ++ 11
我试图做一个vector
的std::thread
秒。 以下三点的结合,说我可以。
1)根据http://en.cppreference.com/w/cpp/thread/thread/thread , thread
的默认构造函数创建一个
线程对象不表示一个线程。
2.)根据http://en.cppreference.com/w/cpp/thread/thread/operator%3D , thread
的operator=
分配[参数,这是一种螺纹右值参考]的状态,以使用移动语义[调用线程]。
3.)根据http://en.cppreference.com/w/cpp/container/vector/vector ,仅通过一个尺寸类型变量为矢量构造器将构造
与容器[指定数目的]值初始化(默认构造,班)T.无拷贝的实例制成。
所以,我这样做:
#include <iostream>
#include <thread>
#include <vector>
void foo()
{
std::cout << "Hello\n";
return;
}
int main()
{
std::vector<std::thread> vecThread(1);
vecThread.at(0) = std::thread(foo);
vecThread.at(0).join();
return 0;
}
这运行正常的VC11和G ++ 4.8.0(在线编译这里)所看到如下所示:
控制台输出:
Hello
然后我试图在铛3.2,通过切换同一网页,这使编译器菜单:
stderr:
pure virtual method called
terminate called without an active exception
当一个线程对象表示一个线程超出范围是前join()
ED或detach()
编,该程序将被强制终止。 我join()
编vecThread.at(0)
所以留在问题的唯一的事情是临时线程
std::thread(foo);
在里面
vecThread.at(0) = std::thread(foo);
分配。
然而,根据网络参考,线程只能通过移动螺纹右值引用指派。 我想不出任何方式join()
或detach()
临时线程对象。
所以,如果铛的输出是正确的,那么有什么用的thread
的operator=
? 或者,这是一个铿锵编译器错误?
以g ++ 4.8.0,改变线
vecThread.at(0) = std::thread(foo)
至
vecThread.at(0) = std::thread{foo}
(用大括号替换括号中)仍给出了预期Hello
输出。
然而,改变线vecThread.at(0) = {foo}
使得它抱怨:
G ++ 4.8.0对大括号投诉:
错误:从初始化列表转换成 '的std ::线程' 将使用显式构造“的std ::螺纹::线程(_Callable &&,_args && ......)与_Callable =无效()(); _args = {}]” vecThread.at(0)= {FOO};
这是太先进了,我不知道这意味着什么。
使在铛相同的变化给出了更先进:
铛3.2对大括号投诉:
error: no viable overloaded '='
vecThread.at(0) = {foo};
...
note: candidate function not viable: cannot convert initializer list
argument to 'const std::thread'
thread& operator=(const thread&) = delete;
...
note: candidate function not viable: cannot convert initializer list
argument to 'std::thread'
thread& operator=(thread&& __t) noexcept
我不知道这意味着什么无论是。
我不能用VC11以证实上述
vecThread.at(0) = {foo}
问题,因为VC11,为2012年11月CTP编译器,不支持标准库的统一初始化语法。