问题标签 [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 延迟初始化如何?/ std::optional 是如何实现的?
最近我对初始化感兴趣。我特别感兴趣的一件事是 std::optional ,因为它能够在声明类型的实例后对其进行初始化。我已经尝试阅读可选标题中的代码,但代码太“夸张”了,我无法理解。
std::optional 如何能够延迟堆栈上对象的初始化?我假设它只是在堆栈上保留 sizeof(<whichever_type) 字节数,然后重新解释这些字节以用于 <whichever_bytes> 的初始化。但它具体是如何做到的呢?它是如何实施的?我怎样才能自己实现呢?
编辑:澄清一下,我知道 std::optional 基本上有一个 bool 成员来跟踪对象是否已初始化,以及另一个包含数据的成员。
但是,我不明白 optional 是如何手动初始化某些东西的。
它是如何破坏对象的?旧的被破坏后,它如何能够重新构建新的?
c++ - 在 protobuf 中表示 std::optional 数组的最佳方法
我需要将具有数组(std::array,但我认为 std::vector 解决方案相同)的“本机”C++ 结构映射到 protobuf。
所以假设我有
我不确定什么是最好的方法。
我目前最好的猜测是:
c++ - std::optional 不编译
此代码不能使用命令 g++ -std=c++17 main.cpp 编译
错误如下:
- 错误:“可选”不是“标准”的成员</li>
- 错误:“int”之前的预期主表达式</li>
有没有办法让这段代码编译?
c++ - 如何在不调用析构函数的情况下将值移出 std:optional ?
我正在尝试编写一个函数,make_foo
它将“解包” a std::optional< foo >
,返回包含的值。该函数假定可选选项已启用,因此不对optional
.
下面是我的实现,以及编译的程序集以供参考。我有几个关于编译器输出的问题:
为什么这会导致代码分支?
optional::operator*
提供对包含值的未经检查的访问,所以我不希望看到任何分支。为什么
foo
会调用析构函数?注意on_destroy()
程序集中的调用。我们如何在不调用析构函数的情况下将包含的值移出可选值?
C++17 源代码
优化的编译器输出 (Clang 11)
c++ - 如何展平嵌套的 std::optional?
注意:这个问题被简单地标记为this的副本,但它不是完全相同的副本,因为我专门询问 std::optionals 。如果您关心一般情况,这仍然是一个值得阅读的好问题。
假设我有嵌套的选项,像这样(愚蠢的玩具示例):
和这个垃圾邮件功能:
展平此可选检查的最佳方法是什么?我做了这样的东西,它不是可变参数,但我不太在意(membr3
如果真的有必要,我可以再添加一个级别(重载),除此之外的所有内容都是糟糕的代码)。
笔记:
- 我不想切换
std::optional
到一些更好的可选. - 我不太关心性能,除非我返回一个我必须复制的指针(除非 arg 是临时的),因为
std::optional
不支持引用。 - 我不关心
flatten_has_value
函数(尽管它很有用),因为如果有一种方法可以很好地展平嵌套的可选项,那么还有一种方法可以编写该函数。 - 我知道我的代码看起来可以工作,但它很丑陋,所以我想知道是否有更好的解决方案。
c++ - 如何正确检查 any_cast 可用?
我有一些输入,可以是简单的值或容器,包装在std::any
. 我不想使用异常,所以我调用返回指针或任何值的noexcept
可变参数方法。any_cast
nullptr
我可以验证任何可用的演员表,typeid()
但我不想使用它并想找到一些替代品。一些 typetraits 方法,例如decltype
,declval
等等。或者干脆使用std::optional
.
但在这种情况下,可选似乎仍然潮湿且不稳定。MSVC 编译器程序在运行时中断std::optional
源代码的深处。
实际上,类型特征检查将是测试any_cast
可能性的最佳方法。但我仍然对 C++ 元编程感到困惑。
c++ - std::optionals 上的数学?
当我尝试这个时:
我明白了:
optional
添加与类型相同的类型似乎很自然size_t
。~~我知道 Haskell 本身就支持这个~~(编辑:这个假设并不完全正确)。当然我可以写一个辅助函数。我问的目的是确保没有更简单的方法可以做到这一点。在你提出建议之前,是的,我已经用谷歌搜索、RTFM 等。
c++ - 如何就地构建可选聚合?
如何就地构造可选聚合?看来我只能构造一个可选的单一事物,而不是可选的事物聚合。
c++ - 在放置构造函数执行时,std::optional 不应该包含它的值吗?
在实际代码中,构造函数可能非常复杂,因此emplace
astd::optional
可以查询可选项本身的状态。当这种情况发生时,它通常会有点复杂,但这里有一个(人为的)最小的例子:
对于所有三个主要的标准库实现,这会产生false
. 换句话说,在 emplaceing 构造函数的执行过程中,可选项不包含 value。
从实现的角度来看,这意味着首先在原地构造值,然后设置一些簿记变量。这确实是MSVC、libc++和libstdc++的情况。
现在标准的相关部分为
[...] 当一个实例
optional<T>
包含一个 value时,这意味着一个 T 类型的对象,称为可选对象的包含值,在可选对象的存储中分配。
有趣的是,这并没有使用明确定义的包含对象的生命周期(我想是因为这可以从外部强制结束,例如othing->~Thing()
),而是在 storage 中分配的术语。该标准通常在动态内存的上下文中谈到分配,在这些情况下,分配显然发生在构造之前。
所以我认为提到的标准库实现不兼容,记账变量应该在构建开始之前设置。
在这种假设下,仍然存在一个问题:实现是否比标准更好,而不是后者需要修复或澄清?我不这么认为:在构建大型对象期间,访问已经初始化的子对象是完全有效且常见的,因此这对于包含在可选对象中的对象也应该是可能的。
那么我的考虑对吗?还是我对分配的术语的解释不正确?是否有反对我对 RightThing™ 做什么的观点的争论?