Читая реализацию 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_;
}
Они выглядят для меня так же, как они функционально идентичны, но есть ли преимущества использования одного над другим?(За исключением очевидного отсутствия размещения новых в последнем, что действительно приятно.)