2012-02-22 4 views
1

저는 최근에 Visual Studio 11 Developer Preview를 설치했습니다. 스레드 및 선물을 가지고 노는 동안이 설치를 둘러 보았습니다.VS 11 with std :: future - 버그입니까?

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

매우 간단합니다. 그러나 "foo"에 대한 두 가지 인수가 있기 때문에 VS 11은 컴파일하려고하지 않습니다. (단, g의 ++을 수행합니다 http://ideone.com/ANrPj)을 (런타임 오류는 문제가되지 않습니다 : std::future exception on gcc experimental implementation of C++0x) (VS 11으로 ErrorMessage : http://pastebin.com/F9Xunh2s)이 오류가 나에게 매우 분명 보이기 때문에, 지금 나는 혼란 조금 해요

, 심지어 경우 개발자 미리보기입니다. 그래서 내 질문은 :

  • 이 코드는 C++ 11 표준에 맞습니까?
  • 이 버그는 이미 알려져 있습니까?

답변

2

다음 임시 해결책을 시도해보십시오.) (

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

표준 기능 표준 (11) C++로 :: 비동기를 (I 비주얼 스튜디오 11 베타에서 시도)이 오버로드를 가지고 있지만, MSVC/CRT는 올바른 오버로드 확인을 할 수 없습니다. 또한 std::launch::any은 표준의 일부가 아닙니다. (std::launch::async|std::launch::deferred이 필요하지만 다시 컴파일 할 수 없음)

+0

버그 보고서를 찾았습니다. http://connect.microsoft.com/VisualStudio/feedback/details/729760/std-async-fails-compilation-for-callable-with-two-or-arguments – yohjp

3

std::future은 가변성 템플릿으로되어있다. 이것은 비동기 적으로 호출되는 함수에 임의의 수의 인수를 전달할 수있게합니다.

불행하게도 VS 11의 현재 미리보기는 가변 템플릿을 지원하지 않습니다. 즉, 하나 이상의 인수를 함수에 전달할 수있는 메커니즘이 없습니다.

결론 : VS가 잘못되었습니다. 누군가가 이것을 버그로보고했는지는 확실치 않지만, 이미 잘 알려진 사실의 직접적인 결과이므로, 그것을보고하면 간접적으로 투표를 추가하는 것 외에는별로 좋지 않을 것입니다. variadic 템플릿이 중요합니다.

VC++ News page을 보면 (현재) 다양한 C++ 11 기능을 준수하도록 지정할 우선 순위를 지정할 수있는 설문 조사 링크가 있습니다. 불행히도 적어도 현재는 오프라인 상태 인 것으로 보입니다. 당신이 할 수 있으면, 당신이 variadic 템플릿을 고려한다는 것을 나타 내기 위해 그것을 채우는 것이 가장 우선적 인 일입니다. (적어도 분명히 보장 할 수는 없지만) 어떤 좋은 일을 할 수있는 기회가 적어도 있습니다.

+0

감사합니다. 라이브러리 구현자는 대개 최대 8 개의 인수를 사용할 수 있도록 가변 템플릿의 부족을 해킹합니다. 지금 std :: async에서 왜 그렇게하지 않았는지 궁금합니다. – cooky451

+3

확실한 해결 방법 : 람다 :'std :: async ([&] {foo (5, 7);}'를 사용하십시오. VS 팀이 그 부분에 많은 노력을 기울이지 않은 주된 이유 중 하나 일 수 있습니다. – Xeo

관련 문제