gpt4 book ai didi

c++ - 传递 std::ref(value) 时是否应应用 std::optional 的推导指南?

转载 作者:太空狗 更新时间:2023-10-29 20:51:26 25 4
gpt4 key购买 nike

背景

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

return std::optional{some_reference};

将是 UB。但是,好像在做

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

不是。 GCC 9 愉快 compiles那。虽然 clang 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>推导。

最佳答案

OP 中的代码格式正确,应生成 optional<reference_wrapper<int>>。 .

这是 llvm bug 34650 .演示该问题的一个更简单的示例是:

std::optional o(42);

gcc 允许它(o 是一个 std::optional<int> ),clang 不允许。

关于c++ - 传递 std::ref(value) 时是否应应用 std::optional 的推导指南?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50204563/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com