问题标签 [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 投票
1 回答
735 浏览

c++ - 在哪些情况下 std::optional operator == 会导致未定义的行为?

Cppreference具有以下混合(可选和一些其他非可选类型)比较运算符的描述std::optional

将 opt 与值进行比较。只有当 opt 包含一个值时,才会比较这些值(使用 T 的相应运算符)。否则, opt 被认为小于值。如果 *opt 和 value 之间对应的双向比较表达式格式不正确,或者其结果不能转换为 bool,则行为未定义。

这里让我感到困惑的是:

  • 这些格式不正确的比较的例子是什么?

  • 为什么编译器/STL 不拒绝无效的比较而不是给我们 UB?

0 投票
1 回答
244 浏览

c++ - boost 是否有一个“紧凑的可选”,其中存在由特殊类型的值编码?

我正在寻找可选 ( sizeof small_optional<T> == sizeof (T)) 的节省空间的实现。所以空虚是用一些特殊的 T 值编码的,例如

要求我从不将 -1 存储在 small_optional 中,因此 -1 可以用作魔术值来确定 optional 是否为空。

0 投票
2 回答
3262 浏览

c++ - `std::make_optional` 的意义何在

std::make_C++17 引入了Class 模板参数推导(除了make_uniqueand make_shared) ,使所有这些都变得多余。

那么有什么意义std::make_optional呢?据我所知,它std::optional.

是否存在std::make_optional优先于扣除指南的情况?

0 投票
2 回答
169 浏览

c++ - 为什么 std::string append 在 rval ref 上没有重载?

我很熟悉,appendinstd::string返回std::string&,因此它不符合被移动的条件,所以结果不会被移动。

https://godbolt.org/z/M63aWW

https://godbolt.org/z/jTnsac

在那里您可以看到,后一个示例将产生更少的分配,因此在这种情况下,最好移动一些看起来像临时的东西。我的问题是为什么他们(委员会)不添加简单&&的重载来生成结果,或者append取决于上下文?我的意思是类似于正在做的事情。有没有一个例子可以证明这种优化是虚假的?std::string&std::string&&std::optionalvalue

0 投票
2 回答
453 浏览

c++ - 错误:没有匹配函数调用 'std::optional::可选(smoltcp::缓冲区&)'

我正在尝试创建一个返回std::optionalto的函数Buffer

Buffer简单的在哪里

但我收到很多错误:

std::optional在其他情况下使用过,我看不出这里有什么问题。

我也尝试使用return std::optional<Buffer>{buffer};.

0 投票
1 回答
376 浏览

c++ - 当 std::optional 被声明为局部变量且未显式初始化时,它是否设置为 std::nullopt?

当 anint在本地声明(但未初始化或分配给)时,它的值未定义。什么时候std::optional<int>在没有显式初始化的情况下在本地声明,同样适用吗?它总是std::nullopt,还是具有未定义的价值?

0 投票
1 回答
257 浏览

c++ - 使用 std::optional作为类 A 的类成员

0 投票
2 回答
193 浏览

c++ - std::optional 如何在幕后工作?

我刚刚了解了 c++ 17 中的 std::optional 特性以及其他一些非常有用的特性......

但是有一些关于 std::optional 的事情我不明白,我希望有人向我解释:

首先,据我所知,在 std::optional 中,返回值可以是指定的类型,也可以是这样的:

return {} 如何什么都不返回?例如,如果我要创建一个返回指定值或不返回任何值的类似类,我如何创建自己的类以便 return {} 有效?我在这里误解了什么?

我的第二个问题是,当你想检查返回值时,你可以这样做:

或者我也可以这样做:

我对此感到非常困惑,变量名如何返回布尔值?不像对象的构造函数可以返回任何东西,那这怎么可能呢?

再次假设我想创建自己的类,它类似于 std::optional 我如何制作它以便我的类的实例可以用作布尔值?

我真的很感激能解决我的问题的答案,而不是与何时使用 std::optional 或为什么我不应该创建自己的类来做同样的事情等相关的答案......

谢谢!

0 投票
1 回答
1224 浏览

c++ - 我可以以某种方式返回 std::optional 与我的数据的 const-reference 以避免复制它吗?

假设我有一些基类可以选择返回一些特定的数据。它还为我提供了“hasData”功能来检查这些特定数据是否可供使用

这很好用,可以做我想要的。但是 'hasData' 和 'getData' 是很好的候选者,可以被一个返回 'std::optional' 的函数替换。但是当我尝试改进返回 std::optional 的 API 时,我意识到我不能再向我的内部数据返回“const 引用”

一种可能性是使用std::optional<Arg1> m_dataMyClassWithOptDerived - 但它对我来说看起来不太好 - 派生类肯定有数据,并且没有理由在其中存储 std::optional 。还需要将“m_data”移动到我绝对不想要的基类

在此类示例中使用 std::optional 并避免复制数据的任何其他可能性?

PS:我检查了一些文章,例如std::optional 专门化的引用类型,似乎无法避免数据复制,我可能应该在这里使用“旧式”界面。

更新: 谢谢大家这么快的回复。对我有用的解决方案是使用 std::reference_wrapper。解决方案代码看起来像

0 投票
2 回答
222 浏览

c++ - 从类方法返回可选

我在一个类中有一个可选成员,我想通过一个方法按值返回。示例代码:

该代码输出一些垃圾值。

我怎样才能做到这一点?


根据我的理解, optional 为底层类型(不仅仅是一个引用)存储了一个完全分配的内存,并且在返回一个可选变量时,底层类型的复制构造函数应该启动,它应该将内存原样复制到新的返回的可选值。