Ошибки компиляции на MSVC с продолжением реализации

Я пытаюсь получить код от эта почта для работы с Visual Studio 2013. Моя текущая версия ниже и отлично работает с gcc и clang (колиру демо).

Стандарт говорит о std :: async в 30.6.8.2:

Требуется: F и каждый Ti в Args должен удовлетворять требованиям MoveConstructible.

Но стандартная библиотека из MSVC, похоже, пытается скопировать объект функтора, который, очевидно, не будет работать из-за члена std :: future.

Мой текущий обходной путь — закомментированный конструктор копирования, который делает злые вещи, но, возможно, справочный объект был бы лучшим обходным путем.

Мой код неверен или в VS есть ошибка? Есть ли лучший обходной путь, если это ошибка?

#ifndef CONTINUATION_H
#define CONTINUATION_H

#include <future>namespace detail {

template<typename F, typename W, typename R>
struct helper
{
F f;
W w;

helper(F f, W w)
: f(std::move(f))
, w(std::move(w))
{
}

/*helper(const helper& other)
: f(std::move(const_cast<helper&>(other).f))
, w(other.w)
{
}*/

helper(helper&& other)
: f(std::move(other.f))
, w(std::move(other.w))
{
}

helper& operator=(helper other)
{
f = std::move(other.f);
w = std::move(other.w);
return *this;
}

R operator()()
{
f.wait();
return w(std::move(f));
}
};

}

namespace util
{
template<typename F, typename W>
auto then(F f, W w) -> std::future<decltype(w(std::move(f)))>
{
return std::async(std::launch::async, detail::helper<F, W, decltype(w(std::move(f)))>(std::move(f), std::move(w)));
}
}

#endifint main()
{
std::promise<int> prom;
auto fut = prom.get_future();

std::thread th([&](){
prom.set_value(42);
});

util::then(std::move(fut), [](std::future<int> f){
printf("future got: %i\n", f.get());
});

th.join();
}

1

Решение

Задача ещё не решена.

Другие решения