问题标签 [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.
c++ - 使用 std::optional 作为常规指针与使用 has_value() 和 value
std::optional
可以使用类似于普通指针的语法访问其值,例如 .
但它也有两个功能,has_value()
提供value()
对其值的访问以及检查该值是否存在。
我想知道这两者有什么区别是为了?
1. 更冗长
2. 性能?
3. 更好的日志记录和调试?value()
会抛出异常。
c++ - 禁用 std::optional 的转发构造函数
我使用模板转换运算符扩展了 QDataStream,以便数据流从自身加载并转换为任何支持的类型,如下所示:
并且可以通过重载运算符 >> 来添加对 QDataStream 不支持的类型的支持,例如:
这个想法是能够直接从流中构造非默认可构造类,如下所示:
这很好用,除非成员是std::optional
. std::optional
的转发构造函数被调用而不是ConvertibleQDataStream
模板转换运算符:
可以禁用std::optional
的转发构造函数吗?或另一种解决方法。
c++ - std::optional:简单和引用限定值()之间的有效区别
这是一个学术问题。该std::optional<T>
类型有一个T && value() &&
方法。我有以下定义:
以及以下程序:
选项 1 和选项 2 之间有什么有意义的区别吗?对于 OPTION 1,我将有1
,0
还是未指定作为输出?根据我的测试,has_value() 在这两种情况下都是正确的。
是否有任何可能的情况value() &&
使std::move
和有所不同value()
?
c++ - 我是否在滥用 std::optional
如何std::optional
适合我的代码?
我的代码包含许多看起来大致如下的函数:
现在我已经找到了std::optional,我只需编写代码:
为什么或何时不使用std::optional
?
- 我知道使用
std::optional
会带来性能价格,为了争论,让我们假设我愿意支付它。 - 我也明白这样的编码:
std::optional<int> iVal = 9;
是没有意义的。
我是不是太着迷了std::optional
?
我发现std::optional
这很自然,以至于我得出一个结论,默认情况下,我的许多本机类型 , bool
,int
应该string
被声明为std::optional
.
因此,而不是遵循以下前提:
std::optional
仅在绝对需要时使用
我倾向于:
std::optional
始终使用,除非您确定现在或将来不需要它。
问题 1
以下规则是否有效:
在以下情况下使用std::optional
:
- 在运行时计算一个值
- 计算可能失败
- 你想知道计算是否失败
问题2
如果使用std::optional
变得丰富,我会冒代码可读性问题的风险吗?
更新
答案和评论使讨论偏离了我最初关心的问题,即试图定义何时使用的经验法则std::optional
。
我将解决我得到的一些常见反馈:
您正在编写 C 风格的错误检查函数。
计算失败时使用异常。
提供一个不太好的例子来说明我的动机可能是我的错。GetName()
只是我的常见用例的一个味道。我不想关注错误是如何反映的(如果有的话),我想关注的是名字是可选的好候选人吗?
我没有说如果GetName
返回 false 意味着我的流程中有某种错误。当GetName
返回 false 时,我可以生成一个随机名称或忽略当前迭代。无论调用者如何对返回值做出反应,name
在optional
某种意义上它都是may not be present
.
我可以提供一个更好的例子:
在这个函数中,我“被迫”提供两个容器,因为我想区分:
- 密钥在数据库中找到,它是空的。这把钥匙在
mapKeyValue
- 在数据库中找不到密钥。. 这个钥匙不会在
mapKeyValue
但optional
我可以去:
我相信我们optional
太从字面上理解这个词了。
如果您想很好地表示可空类型,我真的支持可以使用的概念。std::optional
而不是使用唯一值(如 -1、nullptr、NO_VALUE 等)
c++ 标准委员会很容易决定将 , 命名为std::optional
, std::nullable
。
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 的复制构造函数方面存在问题?我得到错误返回一个函数的实例。例如,
这是我的课。任何见解表示赞赏!
c++ - std::optional 默认构造函数不是 gcc 中的 constexpr?
我有以下代码来测试我的 constexpr 可构造惰性类:
我希望它打印 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{};
不起作用)。我真的不明白。
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
?
c++ - std::optional 如何永远不会“异常无价值”?
std::variant
可以进入一种叫做“异常无价值”的状态。
据我了解,这种情况的常见原因是移动分配引发异常。变体的旧值不再保证存在,预期的新值也不再存在。
std::optional
但是,没有这样的状态。cppreference 提出了大胆的主张:
如果抛出异常,*this ... 的初始化状态不变,即如果对象包含一个值,它仍然包含一个值,反之亦然。
如何std::optional
能够避免成为“异常无价值”,而std::variant
不是?
c++ - 在 noexcept 函数的主体中处理 std::optional 是否安全?
我想使用 std::optional 作为 Maybe 类型,我担心我是否可以使用它来指示某些计算中的潜在失败,因此被观察为空选项。
例如,考虑:
- 这是返回计算的有效技术吗?它可以避免一些异常膨胀吗?
- 这会引起任何麻烦吗?
c++ - 使用 std::move 从 std::optional 缓冲区传递参数时指向空白空间的变量
尝试编写简单的代码来模拟工厂中的解析包。我正在发送一个保存在缓冲区中的包,例如:
发送类:
使用功能:
在将参数传递给对象的函数时:
包已将移动运算符定义为默认值:
下面的函数在传递对象时工作正常,例如:
似乎传递给函数的参数指向一个空的地方,如下所示:
Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)
先感谢您。