在通过标准::ref(值)时,是否应该应用标准::可选?



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 不允许。

最新更新