- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我看到了以下模式 several times :
// T is a type, this is at namespace scope
std::aligned_storage_t<sizeof(T), alignof(T)> storage;
T &t = reinterpret_cast<T &>(storage);
这与足够的命名空间和命名相结合,为变量的用户提供了一个令人愉快的界面 (t
),同时通过放置在库端实现实际对象的延迟构造、重新初始化等new
和显式析构函数调用。你可以看到它在工作 here .
现在,std::aligned_storage
非常简洁,但是 C++17 为我们提供了一个新工具,用于这种存储与对象生命周期的分离,即 std::可选
。
但是,访问 std::optional
值的两种方式(value()
和 operator*
)都需要一个实际存在的值(value);否则 value()
将抛出 std::bad_optional_access
,而 operator*
将触发未定义的行为(通过打破要求 [optional.observe]§5 中的子句)。
std::optional<T> storage;
T &t = *storage; // Looks okay, mines bitcoin when you're not looking
std::optional
的这种用法是否仍然可能以某种方式使用?
如果不是,阻止它的原因是什么?
最佳答案
This, coupled with adequate namespacing and naming, provides a pleasant interface (t) to users of the variable, while enabling deferred construction, reinitialization, etc of the actual object on the library side.
不幸的是,使用t
访问稍后在该地址构造的对象是未定义的行为。这是 reasons 之一为什么要提出 std::launder
。
请注意,此案例不同于 that question 中描述的案例.在那个问题中,引用/指针是在之后创建类型为T
的对象(虽然this may also be undefined在C++17之后没有std::launder
)。
Is such an usage of std::optional still possible somehow?
正如您所指出的,这是未定义的行为。
If not, what would be a reason for preventing it?
优化器可能会发现该地址与为 T
提供存储的对象相关联,并忽略通过导致未定义行为的类型的泛左值对该地址的任何访问。其实原因本质上是how strict-aliasing rules benefit an optimizer .
关于c++ - 我可以创建对空可选值的引用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47977416/
我正在尝试用 Swift 编写这段 JavaScript 代码:k_combinations 到目前为止,我在 Swift 中有这个: import Foundation import Cocoa e
我是一名优秀的程序员,十分优秀!