在阅读GCC的实现时,std::optional我发现了一些有趣的东西.我知道boost::optional实现如下:
template <typename T>
class optional {
// ...
private:
bool has_value_;
aligned_storage<T, /* ... */> storage_;
}
Run Code Online (Sandbox Code Playgroud)
但是libstdc ++和libc ++(以及Abseil)都实现了optional这样的类型:
template <typename T>
class optional {
// ...
private:
struct empty_byte {};
union {
empty_byte empty_;
T value_;
};
bool has_value_;
}
Run Code Online (Sandbox Code Playgroud)
他们看起来因为它们在功能上是相同的,但使用一个优于另一个有什么优势吗?(除了明显缺乏后者的新位置,这真的很好.)