c++ - 在放置构造函数执行时,std::optional 不应该包含它的值吗?
问题描述
在实际代码中,构造函数可能非常复杂,因此emplace
astd::optional
可以查询可选项本身的状态。当这种情况发生时,它通常会有点复杂,但这里有一个(人为的)最小的例子:
#include <iostream>
#include <optional>
struct Thing {
Thing();
};
std::optional<Thing> othing;
Thing::Thing() {
std::cout << othing.has_value() << std::endl;
}
int main() {
othing.emplace();
}
对于所有三个主要的标准库实现,这会产生false
. 换句话说,在 emplaceing 构造函数的执行过程中,可选项不包含 value。
从实现的角度来看,这意味着首先在原地构造值,然后设置一些簿记变量。这确实是MSVC、libc++和libstdc++的情况。
现在标准的相关部分为
[...] 当一个实例
optional<T>
包含一个 value时,这意味着一个 T 类型的对象,称为可选对象的包含值,在可选对象的存储中分配。
有趣的是,这并没有使用明确定义的包含对象的生命周期(我想是因为这可以从外部强制结束,例如othing->~Thing()
),而是在 storage 中分配的术语。该标准通常在动态内存的上下文中谈到分配,在这些情况下,分配显然发生在构造之前。
所以我认为提到的标准库实现不兼容,记账变量应该在构建开始之前设置。
在这种假设下,仍然存在一个问题:实现是否比标准更好,而不是后者需要修复或澄清?我不这么认为:在构建大型对象期间,访问已经初始化的子对象是完全有效且常见的,因此这对于包含在可选对象中的对象也应该是可能的。
那么我的考虑对吗?还是我对分配的术语的解释不正确?是否有反对我对 RightThing™ 做什么的观点的争论?
解决方案
推荐阅读
- react-native - RNRF - Actions.popTo 失败:“使用未知的 routeName 调用”
- python - 将 QLineEdit 输入限制为单个字符 PyQt5
- php - PHP SpreadSheet - 将 col+row 转换为单元格
- python-3.x - 在烧瓶中创建评论部分
- python - 如何保存两个单独的图
- python - Azure databricks msal 库 python 2 而不是 python 3
- jira - 在 Confluence 页面中显示 JIRA 查询
- c++ - 使用 protobuf 序列化数据的问题 - 在发布版本中生成了无效的二进制流(消息中的 1 个额外字节)
- ios - ios 旧主图标在动态更改我的应用程序图标后进入后台时显示
- common-lisp - 如何禁用阅读器宏?