是否应该在传递std :: ref(value)时应用std :: optional的演绎指南?

时间:2018-05-06 21:11:28

标签: c++ templates optional c++17

背景

我希望按顺序运行某些功能,当其中一个功能成功时进行短路。它们都具有相同的返回类型,大多数是零参数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>

1 个答案:

答案 0 :(得分:4)

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

这是llvm bug 34650。证明问题的一个更简单的例子是:

std::optional o(42);

gcc允许它(ostd::optional<int>),而clang则不允许。