c++ - 如何使 lambda 与 std::nullopt 一起工作

标签 c++ lambda c++17 return-type-deduction

背景

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

问题

返回表达式的类型不一致,例如std::nullopt_t无法转换为 std::optional<T> ,即使反过来也行得通。特别是,我希望编译并运行以下代码,并打印 2:

#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 ,因为它可能需要语言支持。

最佳答案

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

auto lambda = []() -> std::optional<int> {
    if (x == 2)
        return std::nullopt;

    return 2;
};

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

关于c++ - 如何使 lambda 与 std::nullopt 一起工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50620202/

相关文章:

c++ - Qt - 没有匹配的函数来调用连接

java - 从 Java 8 中的方法返回 Lambda?

c++ - Lambda 隐式捕获因从结构化绑定(bind)声明的变量而失败

java - Foo::new 和 () -> new Foo() 有什么区别?

c++ - 子类的动态方法在 lambda 捕获中使用时调用父类的虚方法/导致段错误

c++ - 匿名结构中声明的函数的名称解析

c++ - 由于缓存未命中,我应该避免静态编译吗?

c++ - 为什么 std::string 不是 std::vector 的特化?

c++ - 运算符在模板化动态数组中重载 []

c++ - 有没有办法拥有模板的别名并保留类模板参数推导?