我希望按顺序运行某些功能,当其中一个功能成功时进行短路。它们都具有相同的返回类型,大多数是零参数callables(lambdas with capture)。为了识别成功,该函数返回非空可选项。问题是,有时这些函数会返回引用,在这种情况下写入
return std::optional{some_reference};
将是UB。但是,它似乎正在做
return std::optional{std::ref(some_reference)} ;
不是。海湾合作委员会9高兴地compiles。虽然铿锵7 doesn't。
#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>
。
答案 0 :(得分:4)
OP中的代码格式正确,应该产生optional<reference_wrapper<int>>
。
这是llvm bug 34650。证明问题的一个更简单的例子是:
std::optional o(42);
gcc允许它(o
为std::optional<int>
),而clang则不允许。