Search code examples
c++visual-c++c++11overload-resolutionvisual-c++-2012

VS 11 with std::future - Is this a bug?


I recently installed the Visual Studio 11 Developer Preview. While playing with threads and futures, I came around this setup:

#include <future>
#include <iostream>

int foo(unsigned a, unsigned b)
{
    return 5;
}

int main()
{
    std::future<int> f = std::async(foo, 5, 7);
    std::cout << f.get();
}

So, very simple. But since there are two arguments for "foo", VS 11 doesn't want to compile it. (However, g++ does: http://ideone.com/ANrPj) (The runtime error is no problem: std::future exception on gcc experimental implementation of C++0x) (VS 11 errormessage: http://pastebin.com/F9Xunh2s)

I'm a little confused right now, since this error seems extremely obvious to me, even if it is a developer preview. So my questions are:

  • Is this code correct according to the C++11 standard?
  • Is this bug already known/reported?

Solution

  • Try below adhoc workaround. (I tried at Visual Studio 11 Beta)

    std::future<int> f = std::async(std::launch::any, foo, 5, 7);
    

    As C++11 standards function std::async() has two overloads, but MSVC/CRT can't do correct overload resolution. Furthermore std::launch::any is NOT a part of standard. (it requires std::launch::async|std::launch::deferred, but they can't compile again)