【发布时间】:2018-01-14 00:47:48
【问题描述】:
我正在玩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<:function> (int)>,std::function
>::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> 如此特别?
【问题讨论】:
-
注意:
std::variant是 C++17 功能,而不是 C++11。 -
您的编译错误来自第二个示例,但您的问题看起来像是来自您的第一个示例。
标签: c++ lambda future c++17 variant