问题标签 [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 回答
171 浏览

c++ - std::optional 延迟初始化如何?/ std::optional 是如何实现的?

最近我对初始化感兴趣。我特别感兴趣的一件事是 std::optional ,因为它能够在声明类型的实例后对其进行初始化。我已经尝试阅读可选标题中的代码,但代码太“夸张”了,我无法理解。

std::optional 如何能够延迟堆栈上对象的初始化?我假设它只是在堆栈上保留 sizeof(<whichever_type) 字节数,然后重新解释这些字节以用于 <whichever_bytes> 的初始化。但它具体是如何做到的呢?它是如何实施的?我怎样才能自己实现呢?

编辑:澄清一下,我知道 std::optional 基本上有一个 bool 成员来跟踪对象是否已初始化,以及另一个包含数据的成员。

但是,我不明白 optional 是如何手动初始化某些东西的。

它是如何破坏对象的?旧的被破坏后,它如何能够重新构建新的?

0 投票
0 回答
158 浏览

c++ - 在 protobuf 中表示 std::optional 数组的最佳方法

我需要将具有数组(std::array,但我认为 std::vector 解决方案相同)的“本机”C++ 结构映射到 protobuf。

所以假设我有

我不确定什么是最好的方法。

我目前最好的猜测是:

0 投票
1 回答
132 浏览

c++ - std::optional 不编译

此代码不能使用命令 g++ -std=c++17 main.cpp 编译

错误如下:

  1. 错误:“可选”不是“标准”的成员</li>
  2. 错误:“int”之前的预期主表达式</li>

有没有办法让这段代码编译?

0 投票
1 回答
182 浏览

boost - 将 boost::program_options 与 std::optional 一起使用

Boost 的program_options库现在支持boost::optional,同样可以用std::optional?

我试图修改文档示例和 PR 中的代码,但似乎都不起作用。

例如,整数的非常简单的情况(在尝试模板特化之前):

失败并出现目标类型无法执行的错误istream

0 投票
2 回答
275 浏览

c++ - 如何在不调用析构函数的情况下将值移出 std:optional ?

我正在尝试编写一个函数,make_foo它将“解包” a std::optional< foo >,返回包含的值。该函数假定可选选项已启用,因此不对optional.

下面是我的实现,以及编译的程序集以供参考。我有几个关于编译器输出的问题:

  1. 为什么这会导致代码分支?optional::operator*提供对包含值的未经检查的访问,所以我不希望看到任何分支。

  2. 为什么foo会调用析构函数?注意on_destroy()程序集中的调用。我们如何在不调用析构函数的情况下将包含的值移出可选值?

螺栓链接

C++17 源代码

优化的编译器输出 (Clang 11)

0 投票
3 回答
1159 浏览

c++ - 如何展平嵌套的 std::optional?

注意:这个问题被简单地标记为this的副本,但它不是完全相同的副本,因为我专门询问 std::optionals 。如果您关心一般情况,这仍然是一个值得阅读的好问题。

假设我有嵌套的选项,像这样(愚蠢的玩具示例):

和这个垃圾邮件功能:

展平此可选检查的最佳方法是什么?我做了这样的东西,它不是可变参数,但我不太在意(membr3如果真的有必要,我可以再添加一个级别(重载),除此之外的所有内容都是糟糕的代码)。

神螺栓

笔记:

  • 我不想切换std::optional一些更好的可选.
  • 我不太关心性能,除非我返回一个我必须复制的指针(除非 arg 是临时的),因为std::optional不支持引用。
  • 我不关心flatten_has_value函数(尽管它很有用),因为如果有一种方法可以很好地展平嵌套的可选项,那么还有一种方法可以编写该函数。
  • 我知道我的代码看起来可以工作,但它很丑陋,所以我想知道是否有更好的解决方案。
0 投票
2 回答
142 浏览

c++ - 如何正确检查 any_cast 可用?

我有一些输入,可以是简单的值或容器,包装在std::any. 我不想使用异常,所以我调用返回指针或任何值的noexcept可变参数方法。any_castnullptr

我可以验证任何可用的演员表,typeid()但我不想使用它并想找到一些替代品。一些 typetraits 方法,例如decltype,declval等等。或者干脆使用std::optional.

但在这种情况下,可选似乎仍然潮湿且不稳定。MSVC 编译器程序在运行时中断std::optional源代码的深处。

实际上,类型特征检查将是测试any_cast可能性的最佳方法。但我仍然对 C++ 元编程感到困惑。

0 投票
1 回答
156 浏览

c++ - std::optionals 上的数学?

当我尝试这个时:

我明白了:

optional添加与类型相同的类型似乎很自然size_t。~~我知道 Haskell 本身就支持这个~~(编辑:这个假设并不完全正确)。当然我可以写一个辅助函数。我问的目的是确保没有更简单的方法可以做到这一点。在你提出建议之前,是的,我已经用谷歌搜索、RTFM 等。

0 投票
1 回答
381 浏览

c++ - 如何就地构建可选聚合?

如何就地构造可选聚合?看来我只能构造一个可选的单一事物,而不是可选的事物聚合。

0 投票
0 回答
159 浏览

c++ - 在放置构造函数执行时,std::optional 不应该包含它的值吗?

在实际代码中,构造函数可能非常复杂,因此emplaceastd::optional可以查询可选项本身的状态。当这种情况发生时,它通常会有点复杂,但这里有一个(人为的)最小的例子:

对于所有三个主要的标准库实现,这会产生false. 换句话说,在 emplaceing 构造函数的执行过程中,可选项不包含 value

从实现的角度来看,这意味着首先在原地构造值,然后设置一些簿记变量。这确实是MSVClibc++libstdc++的情况。

现在标准的相关部分

[...] 当一个实例optional<T> 包含一个 value时,这意味着一个 T 类型的对象,称为可选对象的包含值,在可选对象的存储中分配。

有趣的是,这并没有使用明确定义的包含对象的生命周期(我想是因为这可以从外部强制结束,例如othing->~Thing()),而是在 storage 中分配的术语。该标准通常在动态内存的上下文中谈到分配,在这些情况下,分配显然发生构造之前。

所以我认为提到的标准库实现不兼容,记账变量应该在构建开始之前设置。

在这种假设下,仍然存在一个问题:实现是否比标准更好,而不是后者需要修复或澄清?我不这么认为:在构建大型对象期间,访问已经初始化的子对象是完全有效且常见的,因此这对于包含在可选对象中的对象也应该是可能的。

那么我的考虑对吗?还是我对分配的术语的解释不正确?是否有反对我对 RightThing™ 做什么的观点的争论?