मैं std::variant, lambdas
और std::future
के साथ खेल रहा हूं, और जब मैंने उन्हें एक साथ लिखने की कोशिश की तो सुपर अजीब परिणाम प्राप्त हुए। यहाँ उदाहरण हैं:,विभिन्न लैम्ब्डा अभिव्यक्तियों के साथ std :: संस्करण को प्रारंभ नहीं कर सकता
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
ठीक लौटने void
int
करने से परिवर्तन variant
के आइटम हस्ताक्षर करने देता है::
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?
यहाँ संकलन त्रुटि है
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' एक सी ++ 17 सुविधा है, सी ++ 11 नहीं। – Rakete1111
आपकी संकलन त्रुटि दूसरे उदाहरण से है, लेकिन आपका प्रश्न ऐसा लगता है कि यह आपके पहले से है। – Barry