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