Я играю с std::variant, lambdas
и std::future
и получаю сверхъестественные результаты, когда я пытался составить их вместе. Вот примеры:
using variant_t = std::variant<
std::function<std::future<void>(int)>,
std::function<void(int)>
>;
auto f1 = [](int) { return std::async([] { return 1; }); };
auto f2 = [](int) { return std::async([] { }); };
variant_t v1(std::move(f1)); // !!! why DOES this one compile when it SHOULDN'T?
auto idx1 = v1.index(); //equals 1. WHY?
variant_t v2(std::move(f2)); // !!! why DOESN'T this one compile when it SHOULD?
Вот ошибка компиляции:
Ошибка C2665 'std:: variant < std:: function < std:: future <void> (int) > , std:: function < void (int) → :: variant ': ни одна из 2 перегрузок может преобразовывать все типы аргументов
ОК, измените variant
подписи элементов от возврата void
до int
:
using variant_t = std::variant<
std::function<std::future<int>(int)>,
std::function<int(int)>
>;
variant_t v1(std::move(f1)); // COMPILES (like it should)
auto idx1 = v1.index(); // equals 0
variant_t v2(std::move(f2)); // DOESN'T compile (like it should)
Что, черт возьми, здесь происходит? Почему std::future<void>
настолько особенный?