Фон
Я хотел бы запускать некоторые функции последовательно, замыкая короткое замыкание, когда одна из них завершается успешно. Все они имеют одинаковый тип возвращаемого значения, в большинстве случаев они могут вызываться с нулевым аргументом (лямбда-выражения с перехватами). Чтобы определить успешность, функция возвращает непустую опцию Дело в том, что иногда эти функции возвращают ссылки, и в этом случае пишется
return std::optional{some_reference};
будет UB. Но, похоже, что делает
return std::optional{std::ref(some_reference)} ;
нет. GCC 9 счастливо компилирует это. Хотя лязг 7 не .
Полный код:
#include <optional>
#include <functional>
#include <iostream>
int main()
{
int x = 12;
auto job = [](const int& y)
{
return std::optional{std::ref(y)};
};
auto value = job(x);
x = 25;
std::cout << *value << '\n';
}
Вопрос
Какой из них прав?
Я полагаю, что код должен скомпилироваться, потому что следует применить вывод аргумента шаблона класса и std::reference_wrapper<int>
вывести.