Фон
У меня есть ряд лямбд, которые выполняют различные проверки перехваченных переменных и возвращают 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 .
Мысли
IПолагайте, что мне нужно где-то использовать std::common_type<Args...>
, но я не могу ни навязать его наличие, ни вывести Args
, так как это может потребовать языковой поддержки.