它就像std::optional
,但不存储额外的布尔值。用户必须确保只有在初始化后才能访问。
template<class T>
union FakeOptional { //Could be a normal struct in which case will need std::aligned storage object.
FakeOptional(){} //Does not construct T
template<class... Args>
void emplace(Args&&... args){
new(&t) T{std::forward<Args&&>(args)...};
}
void reset(){
t.~T();
}
operator bool() const {
return true;
}
constexpr const T* operator->() const {
return std::launder(&t);
}
constexpr T* operator->() {
return std::launder(&t);
}
T t;
};
如果您想知道为什么我需要如此晦涩的数据结构,请查看此处:https ://gitlab.com/balki/linkedlist/tree/master
问题
- 可以忽略
std::launder
吗?我猜不是。 - 由于
std::launder
仅在 c++17 中可用,如何在 c++14 中实现上述类?boost::optional
并且std::experimental::optional
应该需要类似的功能,或者他们是否使用了编译器特定的魔法?
注意:很容易错过,类型声明为union
. 这意味着构造函数T
实际上没有被调用。参考:https ://gcc.godbolt.org/z/EVpfSN