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
。それらを削除すると、プログラムは正常にコンパイルされます。なぜこれが起こっているのですか? また、これまでに試したすべてのコンパイラで失敗するのはなぜですか?