【发布时间】:2019-02-19 15:18:28
【问题描述】:
在阅读 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_;
}
在我看来,它们在功能上是相同的,但是使用其中一个有什么优势吗? (除了后者明显没有放置 new ,这真的很好。)
【问题讨论】:
标签: c++ c++17 unions placement-new stdoptional