VS 11 с std :: future - это ошибка? - PullRequest
       25

VS 11 с std :: future - это ошибка?

1 голос
/ 22 февраля 2012

Недавно я установил Visual Studio 11 Developer Preview.Играя с потоками и фьючерсами, я пришел к такой настройке:

#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 исключение при экспериментальной реализации gcc C ++ 0x ) (VS 11 errormessage: http://pastebin.com/F9Xunh2s)

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

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

Ответы [ 2 ]

3 голосов
/ 22 февраля 2012

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

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

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

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

2 голосов
/ 15 марта 2012

Попробуйте ниже adhoc обходной путь. (Я пробовал в Visual Studio 11 Beta)

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

Как и в стандартах C ++ 11, функция std :: async () имеет две перегрузки, но MSVC / CRT не может сделать правильное разрешение перегрузки. Кроме того, std::launch::any НЕ является частью стандарта. (требуется std::launch::async|std::launch::deferred, но они не могут скомпилироваться снова)

...