Background
我想按顺序运行一些函数,当其中一个成功时短路。它们都具有相同的返回类型,大多是零参数可调用对象(带有捕获的 lambda)。为了标识成功,该函数返回非空的可选。问题是有时这些函数返回引用,在这种情况下写入
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>
推导。
OP 中的代码格式良好,应该产生一个optional<reference_wrapper<int>>
。
这是 llvm 错误 34650。演示该问题的一个更简单的示例是:
std::optional o(42);
GCC 允许它(o
是一个std::optional<int>
),Clang 不允许。