【问题标题】:Return variant from a lambda从 lambda 返回变体
【发布时间】:2019-08-30 12:26:09
【问题描述】:

我有这个简单的 lambda:

    std::variant<int, char> myLambda = []() { // no suitable user-defined conversion from "type" to "std::variant<int, char>" exists
        std::variant<int, char> res;

        if (true)
        {
            res = 1;
        }
        else
        {
            res = 'c'; 
        }

        return res;
    };

但它不能编译,产生错误no suitable user-defined conversion from "type" to "std::variant&lt;int, char&gt;" exists。我做错了什么?

【问题讨论】:

  • 您需要调用 lambda 将最后一个 }; 更改为 }(); Typo?
  • @RichardCritten 不,我只想初始化 lambda,而不是调用它。
  • @RichardCritten 但是,你让我明白我的错误,谢谢!
  • 2 个解决方案的问题....我建议了错误的一个。很高兴下面的答案对您有所帮助。
  • 可能:auto myLambda = [&amp;]() -&gt; std::variant&lt;int, char&gt; { if (cond) { return 1; } else { return 'c'; }}};.

标签: c++ lambda variant


【解决方案1】:

你的意思是

std::variant<int, char> v = []() {
    std::variant<int, char> res;

    if (true)
    {
        res = 1;
    }
    else
    {
        res = 'c'; 
    }

    return res;
}();
^^^

你的意思是

auto myLambda = []() {
    std::variant<int, char> res;

    if (true)
    {
        res = 1;
    }
    else
    {
        res = 'c'; 
    }

    return res;
};

Lambda 表达式具有唯一的类型。

【讨论】:

    【解决方案2】:

    lambda 表达式类型错误。您正在尝试绑定到std::variant&lt;int, char&gt;。 Lambda 表达式类型名称是 impl 定义的。使用auto

    auto processProjectFile = []() {
        std::variant<int, char> res;
        if (true) {
            res = 1;
        } else {
            res = 'c'; 
        }
        return res;
    };
    

    (可选)您可以将 lambda 类型转换为 std::function,将 auto 替换为 std::function&lt;std::variant&lt;int, char&gt;(void)&gt;

    但如果您打算调用 lambda,只需将末尾的 }; 替换为 }();

    【讨论】:

    • 是的,这就是我错过的。谢谢。我遇到的愚蠢错误。顺便说一句,std::function 部分很方便!谢谢!
    • 不确定ClosureType 是什么意思。 lambda 类型的名称是 impl-defined
    猜你喜欢
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    • 2012-09-20
    • 2014-06-17
    相关资源
    最近更新 更多