2012-02-22 2 views
1

Недавно я установил предварительный просмотр Visual Studio 11 Developer. Во время игры с потоками и фьючерсами я подошел к этой настройке:VS 11 с 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 не хочет его компилировать. (Тем не менее, г ++ делает: http://ideone.com/ANrPj) (Ошибка выполнения не проблема: std::future exception on gcc experimental implementation of C++0x) (VS 11 ErrorMessage: http://pastebin.com/F9Xunh2s)

Я немного смущен прямо сейчас, так как эта ошибка кажется очень очевидным для меня, даже если это является предварительным просмотром разработчика. Итак, мои вопросы:

  • Правильно ли этот код соответствует стандарту C++ 11?
  • Эта ошибка уже известна/сообщена?

ответ

2

Попробуйте выполнить вспомогательное обходное решение. (Я пробовал в Visual Studio 11 Beta)

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

В C++ 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-more-arguments – yohjp

3

std::future должен быть вариационным шаблоном. Это позволяет передавать произвольное количество аргументов функции, вызываемой асинхронно.

К сожалению, текущий предварительный просмотр VS 11 не поддерживает вариационные шаблоны, что означает, что у него нет механизма для передачи более одного аргумента функции.

Подводя итог: VS ошибается. Я не уверен, что кто-то сообщил об этом как об ошибке, но это прямое следствие того факта, который уже хорошо известен, поэтому сообщение о нем, вероятно, не будет/не будет делать много хорошего, кроме косвенного добавления голоса что вариативные шаблоны важны.

Если вы посмотрите на VC++ News page, у них (в настоящее время) есть ссылка на опрос, который должен указывать приоритеты, которые вы назначили для соответствия различным функциям C++ 11. К сожалению, он, похоже, отключен, по крайней мере, на данный момент. Когда вы можете, заполнив его, чтобы указать, что вы рассматриваете вариативные шаблоны, высокий приоритет имеет хотя бы некоторый шанс сделать что-то полезное для этого (хотя я, очевидно, ничего не могу гарантировать).

+0

Спасибо. Разработчики библиотеки обычно взламывают недостаток вариативных шаблонов, поэтому можно использовать до ~ 8 аргументов. Мне просто интересно, почему они не сделали этого для std :: async. – cooky451

+3

Очевидное обходное решение: Используйте лямбда: 'std :: async ([&] {foo (5, 7);})'. Возможно, это одна из основных причин, почему команда VS не прилагала больших усилий для этой цели. – Xeo

Смежные вопросы