Почему дополнительный параметр boost не является оберткой вокруг T *? - программирование
Подтвердить что ты не робот

Почему дополнительный параметр boost не является оберткой вокруг T *?

Так как boost::optional<T&> уже является специализацией, почему он не реализован как обертка вокруг T*? Это позволило бы ему занимать меньше места, так как нет необходимости в m_initialized boolean.

4b9b3361

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