以下のコードを検討してください。
#include <memory>
#include <future>
using namespace std;
template <typename T, typename Work>
void Test2(future<T> f, Work w)
{
async([](future<T> && f, Work w)
{}, move(f), move(w));
}
int main()
{
future<int> x = std::async([]()->int{
std::this_thread::sleep_for(std::chrono::microseconds(200));
return 10;
});
Test2(std::move(x), [](int x){});
return 0;
}
上記は、次のコンパイラ エラーで失敗します。
エラー 1 エラー C2664: 'void Test2::::operator ()(std::future<_Ty> &&,Work) const': パラメーター 1 を 'std::future<_Ty>' から 'std::future に変換できません<_Ty> &&' c:\program files (x86)\microsoft visual studio 11.0\vc\include\xrefwrap 98 1 ConsoleApplication6
GCC 4.7.2 は問題なくコンパイルされます http://ideone.com/KhMiV6
Microsoft Connect で報告する前に:
1) これは VC11 側のバグですか、それとも実際には標準的な動作ですか?
2) これに対する回避策を知っている人はいますか?
編集: Microsoft Connect here で報告しました。より迅速な解決のために、賛成票を投じることをお勧めします。