c++ - 传递 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>
推导。
解决方案
OP 中的代码格式正确,应该产生一个optional<reference_wrapper<int>>
.
这是llvm 错误 34650。演示该问题的一个更简单的示例是:
std::optional o(42);
gcc 允许它(o
作为 a std::optional<int>
),clang 不允许。
推荐阅读
- javascript - 如何通过组合键值来创建多个数组?
- ansible - 如何修复 Ansible 错误:“冲突的操作语句:包含,文件”
- php - 使用 PHP 使用 LIMIT 调用参数化 MariaDB SP 时出现问题
- reactjs - 如何保护 Firebase 托管中的第三方 API 密钥?
- c# - 为什么 RabbitMQ 连接在 Linux 上失败,但在 Windows 上有效?
- javascript - 将 HTML 转换为 PDFmake 语法
- javascript - How To disable zoom in/out webview but increase font-size on Pinch
- java - 如何从动态 JCheckBox 中获取价值?
- email - DMARC 失败仅适用于linkedin
- css - 如何使用 id 属性以角度导入样式表?