从Lambda返回std::variant<int,char>编译失败,报错无合适转换求解答
问题分析与修复方案
嘿,我来帮你拆解这个编译错误的原因!你遇到的问题本质是类型不匹配:
你试图把一个Lambda表达式(它是一个匿名的闭包类型)直接赋值给std::variant<int, char>,但这个variant的备选类型只有int和char,根本不包含Lambda的闭包类型,编译器自然找不到能把闭包对象转成int或char的方法,所以报了那个转换错误。
两种正确的处理方式
根据你的代码逻辑,我猜你大概率是想把Lambda执行后的结果存进variant里,不过也给你补上另一种(如果是想存Lambda本身的)场景的解法:
场景1:存储Lambda的执行结果(应该是你的真实需求)
你需要调用这个Lambda,把它返回的std::variant<int, char>值赋值给变量,而不是把Lambda对象本身赋值上去。只需要在Lambda后面加一对括号就行:
std::variant<int, char> myLambdaResult = []() { std::variant<int, char> res; if (true) { res = 1; } else { res = 'c'; } return res; }(); // 这里的括号就是执行Lambda的关键!
顺便说一句,你的Lambda逻辑还能简化,不用提前创建res变量,直接返回对应值就行:
// 简化版写法 std::variant<int, char> myLambdaResult = []() -> std::variant<int, char> { return true ? 1 : 'c'; }();
场景2:如果确实想存储Lambda本身
要是你真的想把这个Lambda对象存在variant里,那得把Lambda的类型加入到variant的模板参数中。因为Lambda是匿名类型,我们可以用std::function来包装它:
// 把std::function的类型加入variant的备选类型 std::variant<int, char, std::function<std::variant<int, char>()>> myStoredLambda = []() { std::variant<int, char> res; if (true) { res = 1; } else { res = 'c'; } return res; }; // 之后调用Lambda的方式 auto lambda = std::get<std::function<std::variant<int, char>()>>(myStoredLambda); auto result = lambda();
内容的提问来源于stack exchange,提问作者Nurbol Alpysbayev
相关产品推荐
相关产品推荐

