我正在std::move
通过在我的编译器上测试它来审查函数的变体。由于某种原因,该程序在最新的 clang++ 和 g++4.8 中都失败了。在我看来,这看起来应该是一个正确的程序。
g++-4.8 -std=c++1y -O3 -Wall -pthread main.cpp && ./a.out
在没有活动异常的情况下调用终止
/tmp/1370796977-600590525/cmd.sh: line 7: 22819 Aborted (core dumped) ./a.out
#include <iostream>
#include <vector>
#include <list>
#include <iterator>
#include <thread>
#include <chrono>
void f(int n)
{
std::this_thread::sleep_for(std::chrono::seconds(n));
std::cout << "thread " << n << " ended" << '\n';
}
int main()
{
std::vector<std::thread> v;
v.emplace_back(f, 1);
v.emplace_back(f, 2);
v.emplace_back(f, 3);
std::list<std::thread> l;
for(auto& t : l) t.join();
}
我注意到导致错误的部分是emplace_back
线条。当我删除它们时,程序会正常编译。为什么会发生这种情况,为什么到目前为止我尝试过的所有编译器都失败了?