C++11 error C2280 (VC++ 2013のバグ)

・threadコンストラクタを介して右辺値参照を渡せないのはVC++の既知バグ(VC++ 2012でも同じ)であることをAlex KorbanのC++ Rocks(p.197)で知った

 

// promiseをthreadコンストラクタに渡そうとするとエラーになる

error C2280: 'std::promise<int>::promise(const std::promise<int> &)' : 削除された関数を参照しようとしています。

以下がそのコード例。gcc(Ubuntu)では問題なく動く。

// VC++ 2013ではC2280エラーになる

#include <iostream>       // std::cout

#include <thread>         // std::thread

#include <future>         // std::promise, std::future

 

void producer(std::promise<int> p) {

p.set_value(10);

}

 

int main()

{

std::promise<int> prom;                      // create promise

 

std::future<int> fu = prom.get_future();    // engagement with future

std::thread th(producer, move(prom));

std::cout << fu.get() << '\n';

th.join(); 

}