我已经多次看到以下模式:
// 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
令人愉快的接口(你可以看到它在这里工作。
现在,std::aligned_storage
很简洁,但是 C++17 为我们提供了一个用于存储与对象生命周期分割的新工具,即std::optional
.
但是,访问std::optional
(value()
和operator*
) 值的两种方法都需要一个值才能实际存在。否则value()
将 throw std::bad_optional_access
,而operator*
将触发未定义的行为(根据[optional.observe]§5中的requires子句)。
std::optional<T> storage;
T &t = *storage; // Looks okay, mines bitcoin when you're not looking
std::optional
以某种方式仍然可以使用这种用法吗?
如果没有,阻止它的原因是什么?