gpt4 book ai didi

c++ - 我可以创建对空可选值的引用吗?

转载 作者:太空狗 更新时间:2023-10-29 21:12:12 27 4
gpt4 key购买 nike

我看到了以下模式 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com