【发布时间】:2018-11-10 05:23:58
【问题描述】:
背景
我有一系列 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,因为它可能需要语言支持。
【问题讨论】:
-
std::optional<int> result{}; if(2 != x) { result.emplace(2); } return result; -
@VTT,哇,我没想到。这样会好一些。
标签: c++ lambda c++17 return-type-deduction