背景
我有一系列 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';
}
想法
我相信我需要使用 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/