私はstd::variant, lambdas
とstd::future
で遊んでいて、それらを一緒に合成しようとしたときに非常に奇妙な結果を得ました。ここでの例は以下のとおりです。さまざまなラムダ式を使ってstd :: variantを初期化できません
Error C2665 'std::variant<std::function<std::future<void> (int)>,std::function<void (int)>>::variant': none of the 2 overloads could convert all the argument types
OK、int
にvoid
を返すから変更variant
のアイテムの署名をすることができます::
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)
ここ
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?
は、コンパイルエラーがありますここにいる? std::future<void>
はなぜ特別なのですか?
注: 'std :: variant'はC++ 17の機能であり、C++ 11ではありません。 – Rakete1111
あなたのコンパイルエラーは2番目の例のものですが、あなたの質問はあなたの最初のもののように見えます。 – Barry