首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使lambdas与std::nullopt一起工作

如何使lambdas与std::nullopt一起工作
EN

Stack Overflow用户
提问于 2018-05-31 16:46:37
回答 2查看 900关注 0票数 4

背景

我有一系列lambda,它们对捕获的变量执行不同的检查,如果检查失败,则返回std::nulloptreturn std::nullopt是第一个返回语句。然后,如果检查成功,它们将继续计算该值。

问题

返回表达式的类型不一致,例如std::nullopt_t不能转换为std::optional<T>,尽管另一种方式也可以。特别是,我希望编译并运行以下代码,打印2:

代码语言:javascript
复制
#include <functional>
#include <utility>
#include <optional>

int x = 3;

auto lambda = [](){
    if (x == 2)
        return std::nullopt;

    return std::optional(2);
};

#include <iostream>

int main () {
    using return_type = std::invoke_result_t<decltype(lambda)>;
    static_assert(std::is_same<return_type, std::optional<int>>{}, 
                  "return type is still std::nullopt_t");

    std::cout << lambda().value() << '\n';
}

Wandbox Demo

思考

我认为我需要在某个地方使用std::common_type<Args...>,但我既不能强制使用它,也不能推断出Args,因为它可能需要语言支持。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-31 16:48:30

与其使用模板类型推断来推断lambda的返回类型,为什么不显式地指定该返回类型呢?

代码语言:javascript
复制
auto lambda = []() -> std::optional<int> {
    if (x == 2)
        return std::nullopt;

    return 2;
};

std::common_type通常与模板一起使用,而您没有模板。

票数 6
EN

Stack Overflow用户

发布于 2018-05-31 17:13:57

我建议坚持使用单个返回语句和显式指定的结果类型,而不使用nullopt。当函数返回整数或nullopt时,它看起来有点误导。特别是如果函数更长的话。此外,如果值类型是具有显式构造函数的类型,则使用emplace可以避免再次输入值类型名称。

代码语言:javascript
复制
auto lambda = []()
{
    std::optional<int> result{};
    if(2 != x)
    {
        result.emplace(2);
    }
    return result;
};
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50620202

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档