在阅读 GCC 的实现时,std::optional
我注意到了一些有趣的事情。我知道boost::optional
实现如下:
template <typename T>
class optional {
// ...
private:
bool has_value_;
aligned_storage<T, /* ... */> storage_;
}
但是libstdc++和libc++(和Abseil)都像这样实现它们的optional
类型:
template <typename T>
class optional {
// ...
private:
struct empty_byte {};
union {
empty_byte empty_;
T value_;
};
bool has_value_;
}
在我看来,它们在功能上是相同的,但是使用其中一个有什么优势吗?(除了后者明显缺乏新的位置,这真的很好。)