Так как 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&>
по необработанному указателю, является совершенно отдельным, поэтому не стесняйтесь задавать его отдельно...