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(); 

}

C++11 thread_local (VC++ 2013)

VC++ Nov 2013 CTPでも標準のthread_localは、まだ未実装。

例えば thread_local int n → static __declspec(thread) int n とする。

gcc (Ubuntu)は、問題なし。

gcc 4.8.1をビルドする。CentOS 6.4

4.7.3の時もこの方法でビルドした。自分へのメモとして残す。

gccのINSTALLに則ればいいだけなのだが。。。

$ tar zxvf gcc-4.8.1.tar.gz

$ ./contrib/download_prerequisites (gmp, mpc, mpfrがダウンロードされ、インストールされる。自分で集めてくる必要はない。)

$ sudo yum install glibc-devel.i686 (もしgccのビルドがその環境で始めての場合)

$ cd ..

$ mkdir gcc-build (Sourceファイルのディレクトリとは別ディレクトリでビルドするのがミソ。そうしないでトラブルことがままあるとも事。)

$ cd gcc-build

$ ../gcc-4.8.1/configure

$ make  (2時間ぐらいかかったが)

$ sudo make install