首页 > 解决方案 > 传递 std::ref(value) 时是否应应用 std::optional 的扣除指南?

问题描述

背景

我想按顺序运行一些功能,当其中一个成功时短路。它们都具有相同的返回类型,大多是零参数可调用对象(带有捕获的 lambdas)。为了识别成功,该函数返回非空可选。问题是有时这些函数返回引用,在这种情况下编写

return std::optional{some_reference};

将是UB。但是,好像在做

return std::optional{std::ref(some_reference)} ;

不是。GCC 9 愉快地编译 了它。虽然 clang 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>推导。

标签: c++templatesoptionalc++17

解决方案


OP 中的代码格式正确,应该产生一个optional<reference_wrapper<int>>.

这是llvm 错误 34650。演示该问题的一个更简单的示例是:

std::optional o(42);

gcc 允许它(o作为 a std::optional<int>),clang 不允许。


推荐阅读