Так как boost::optional<T&> уже является специализацией, почему он не реализован как обертка вокруг T*? Это позволило бы ему занимать меньше места, так как нет необходимости в m_initialized boolean.
Почему дополнительный параметр boost не является оберткой вокруг T *?
Ответ 1
Вероятно, потому что неинициализированный объект boost::optional<T*> должен отличаться от boost::optional<T*>, инициализированного NULL, например. эта функция не может вернуть значение, a NULL или указатель не NULL.
Почему бы вам не использовать простой указатель в этом случае с NULL, указывающим отсутствие значения. Не нужно добавлять больше сложности с помощью boost::optional<>. Я имею в виду, что легко сделать вещи более сложными, но трудно сделать их лучше.
Ответ 2
Так как boost 1.61 опционально оптимизируется в случае ссылок.
В примечаниях к выпуску упоминается:
sizeof(optional<T&>) == sizeof(T*)
следовательно, он определенно реализован как указатель в этом случае.
Ответ 3
Во-первых, boost::optional<T&> не является специализацией. Если вы посмотрите на код, вы увидите, что он выполняет некоторую отправку меток для настройки поведения для ссылочных типов, но сам шаблон boost::optional_base<T> не является специализированным.
Однако вопрос о том, почему эта оптимизация пространства не реализована, по-прежнему является законным вопросом. Возможно, потому что это не специализировано, работа намного сложнее, я не знаю.
Вопрос о том, почему вы предпочитаете optional<T&> по необработанному указателю, является совершенно отдельным, поэтому не стесняйтесь задавать его отдельно...