И libstdc++ (GNU), и libc++ (LLVM) реализуют хранилище значений std::optional
с использованием объединения, и оба они содержат фиктивный элемент.
Реализация GNU:
using _Stored_type = remove_const_t<_Tp>;
struct _Empty_byte { };
union {
_Empty_byte _M_empty;
_Stored_type _M_payload;
};
Реализация LLVM:
union
{
char __null_state_;
value_type __val_;
};
Мой вопрос: зачем нам эти члены _M_empty
/__null_state_
? Что-то не так с профсоюзом из одного члена?