问题标签 [stdoptional]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
3766 浏览

c++ - 使用 std::optional 作为常规指针与使用 has_value() 和 value

std::optional可以使用类似于普通指针的语法访问其值,例如 .

但它也有两个功能,has_value()提供value()对其值的访问以及检查该值是否存在。

我想知道这两者有什么区别是为了?
1. 更冗长
2. 性能?
3. 更好的日志记录和调试?value()会抛出异常。

0 投票
1 回答
145 浏览

c++ - 禁用 std::optional 的转发构造函数

我使用模板转换运算符扩展了 QDataStream,以便数据流从自身加载并转换为任何支持的类型,如下所示:

并且可以通过重载运算符 >> 来添加对 QDataStream 不支持的类型的支持,例如:

这个想法是能够直接从流中构造非默认可构造类,如下所示:

这很好用,除非成员是std::optional. std::optional的转发构造函数被调用而不是ConvertibleQDataStream模板转换运算符:

可以禁用std::optional的转发构造函数吗?或另一种解决方法。

0 投票
4 回答
199 浏览

c++ - std::optional:简单和引用限定值()之间的有效区别

这是一个学术问题。该std::optional<T>类型有一个T && value() &&方法。我有以下定义:

以及以下程序:

选项 1 和选项 2 之间有什么有意义的区别吗?对于 OPTION 1,我将有10还是未指定作为输出?根据我的测试,has_value() 在这两种情况下都是正确的。

是否有任何可能的情况value() &&使std::move和有所不同value()

0 投票
4 回答
2762 浏览

c++ - 我是否在滥用 std::optional

如何std::optional适合我的代码?

我的代码包含许多看起来大致如下的函数:

现在我已经找到了std::optional,我只需编写代码:

为什么或何时不使用std::optional

  1. 我知道使用std::optional会带来性能价格,为了争论,让我们假设我愿意支付它。
  2. 我也明白这样的编码: std::optional<int> iVal = 9;是没有意义的。

我是不是太着迷了std::optional

我发现std::optional这很自然,以至于我得出一个结论,默认情况下,我的许多本机类型 , bool,int应该string被声明为std::optional.

因此,而不是遵循以下前提:

std::optional 在绝对需要时使用

我倾向于:

std::optional始终使用,除非您确定现在或将来不需要它。

问题 1

以下规则是否有效:

在以下情况下使用std::optional

  1. 在运行时计算一个值
  2. 计算可能失败
  3. 你想知道计算是否失败

问题2

如果使用std::optional变得丰富,我会冒代码可读性问题的风险吗?


更新

答案和评论使讨论偏离了我最初关心的问题,即试图定义何时使用的经验法则std::optional

我将解决我得到的一些常见反馈:

您正在编写 C 风格的错误检查函数。

计算失败时使用异常。

提供一个不太好的例子来说明我的动机可能是我的错。GetName()只是我的常见用例的一个味道。我不想关注错误是如何反映的(如果有的话),我想关注的是名字是可选的好候选人吗?

我没有说如果GetName返回 false 意味着我的流程中有某种错误。当GetName返回 false 时,我可以生成一个随机名称或忽略当前迭代。无论调用者如何对返回值做出反应,nameoptional某种意义上它都是may not be present.

我可以提供一个更好的例子:

在这个函数中,我“被迫”提供两个容器,因为我想区分:

  1. 密钥在数据库中找到,它是空的。这把钥匙在mapKeyValue
  2. 在数据库中找不到密钥。. 这个钥匙不会在mapKeyValue

optional我可以去:


我相信我们optional太从字面上理解这个词了。

如果您想很好地表示可空类型,我真的支持可以使用的概念。std::optional 而不是使用唯一值(如 -1、nullptr、NO_VALUE 等)

c++ 标准委员会很容易决定将 , 命名为std::optional, std::nullable

0 投票
2 回答
337 浏览

c++ - 子类化 std::optional 时编译错误

我正在尝试在 MS C++17(VS2017)中对 std::optional 进行子类化以向类添加消息字段,但出现编译错误

错误 C2280:“ OptMsg<bool>::OptMsg(const OptMsg<bool> &)”:试图引用已删除的函数

Intellisense 提供了更多的洞察力:

函数“ OptMsg<T>::OptMsg(const OptMsg<bool> &) throw() [with T=bool]”(隐式声明)不能被引用——它是一个被删除的函数

这告诉我编译器在引用已删除函数 throw 的复制构造函数方面存在问题?我得到错误返回一个函数的实例。例如,

这是我的课。任何见解表示赞赏!

0 投票
1 回答
122 浏览

c++ - std::optional 默认构造函数不是 gcc 中的 constexpr?

我有以下代码来测试我的 constexpr 可构造惰性类:

https://godbolt.org/z/rMLCiL

我希望它打印 10 in main. 在 clang-8.0 中编译时,它按预期运行,但在 gcc 中编译时(在 8.3 中或在主干中),它会导致分段错误。似乎a不是constant-initialized,它在初始化之前在a.m_initializer内部调用 null 。int val = a->f()a

Cppreference表示std::optional<T>可以使用constexpr构造函数将其初始化为 std::nullopt ,无论 T 是否可轻易破坏。因此,Lazy<A> a{[] { return A{}; }}应该在初始化之前进行常量int val = a->f();初始化。如果我注释掉A::~A,即使使用 gcc 编译,它也会按预期运行。这是 gcc 中的错误,还是我遗漏了什么?

更新:我还发现如果我创建std::optional<T>一个基类而不是拥有这样的成员,它在 gcc 中可以正常工作。另外,如果我只是将行更改std::optional<T> m_val = std::nullopt;std::optional<T> m_val;,它可以正常工作(std::optional<T> m_val{};不起作用)。我真的不明白。

0 投票
3 回答
4307 浏览

c++ - 在 C++11 上下文中使用 std::optional

我正在编写一个小型 C++11 库,我相信在其中std::optional可以很好地添加一些可以返回nullptr. 但是,std::optional它是 C++17 的一个特性。由于要求是 C++11,因此我正在寻找std::optional在保持兼容性的同时使用的方法。

我发现可以测试功能宏。我想我可以用它来检测是否std::optional可用......但是当它不可用时,最好的方法是什么?

我应该提供自己的std::optional实现吗?

不可用nullptr时退货?std::optional(可能会弄乱我的代码。)

还是放弃这个想法并继续返回nullptr

0 投票
3 回答
628 浏览

c++ - std::optional 如何永远不会“异常无价值”?

std::variant可以进入一种叫做“异常无价值”的状态。

据我了解,这种情况的常见原因是移动分配引发异常。变体的旧值不再保证存在,预期的新值也不再存在。

std::optional但是,没有这样的状态。cppreference 提出了大胆的主张:

如果抛出异常,*this ... 的初始化状态不变,即如果对象包含一个值,它仍然包含一个值,反之亦然。

如何std::optional能够避免成为“异常无价值”,而std::variant不是?

0 投票
2 回答
210 浏览

c++ - 在 noexcept 函数的主体中处理 std::optional 是否安全?

我想使用 std::optional 作为 Maybe 类型,我担心我是否可以使用它来指示某些计算中的潜在失败,因此被观察为空选项。

例如,考虑:

  • 这是返回计算的有效技术吗?它可以避免一些异常膨胀吗?
  • 这会引起任何麻烦吗?
0 投票
0 回答
48 浏览

c++ - 使用 std::move 从 std::optional 缓冲区传递参数时指向空白空间的变量

尝试编写简单的代码来模拟工厂中的解析包。我正在发送一个保存在缓冲区中的包,例如:

发送类:

使用功能:

在将参数传递给对象的函数时:

包已将移动运算符定义为默认值:

下面的函数在传递对象时工作正常,例如:

似乎传递给函数的参数指向一个空的地方,如下所示:

Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)

先感谢您。