在通过标准::ref(值)时,是否应该应用标准::可选?
Should deduction guide for std::optional be applied when passing std::ref(value)?
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 不允许。
相关文章:
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- 标准是否严格定义了该程序应该如何编译?
- C++标准是否允许<double>在没有开销的情况下实现 std::可选
- 标准是否保证无捕获的 lambda 为空?
- C++:带有大括号初始化列表的函数调用表达式 - 标准是否规定在单个元素列表的微不足道的情况下忽略大括号?
- C++11 标准是否保证零值有符号整数的一元减号为零?
- C++标准:是否有结果对象?
- c++标准是否指定了运算符&&(内置)的求值顺序?
- 该标准是否说明了例外和不同调用约定的共存
- C++标准是否定义了结构中成员函数的函数内定义是否必须具有静态链接?
- 标准是否阻止在可变参数模板中使用足够小的文本值缩小文本转换范围
- C++标准是否包括标准标头必须包含的内容?
- C++标准是否保证 std::string::resize(new_size) 在new_size不大于旧标准时不会导致
- 标准是否定义了共同基础?
- C++标准是否保证失败的插入到关联容器中不会修改 rvalue-reference 参数?
- C++标准是否明确允许/禁止实例化不完整类型的 std::函数?
- 标准是否保证在移动std::p ackaged_task后安全使用std::future?
- C 17标准是否保证工会的地址与其成员的地址相同
- C 标准是否保证统一初始化是例外安全
- C++标准是否允许复制任意多态数据结构?