optional<T&>
был удален из дорожки стандартизации С ++, потому что его использование вызывает сомнения: он ведет себя почти идентично не-обладания T*
с немного отличается (и смешения отличается от optional<T>
и T*
) семантики.
optional<T&>
в основном не владеющий T*
завернутый симпатичный, и несколько странно.
Теперь, optional<T>
- это отличное зверь.
Я использовал optional<Iterator>
в своих алгоритмах поиска на основе контейнеров. Вместо того, чтобы возвращать end()
, я возвращаю пустую опцию. Это позволяет пользователям определить без сравнения, если они не смогли найти элемент, и позволяет такой код:
if(linear_search_for(vec, item))
работы, в то время как тот же алгоритм также позволяет получить как на пункте и расположение пункта в контейнере, если он вам действительно нужен.
Указатели на элементы не дают вам информации о местоположении, которую вы можете захотеть, за исключением смежных контейнеров.
Итак, здесь я создал нулевой итератор, который имеет преимущества итераторов (в основном работающих с различными типами контейнеров) и указателей (может быть проверен на нулевое состояние).
Следующее использование фактически возвращает значение. Предположим, у вас есть функция, которая вычисляет прямоугольник.
Rect GetRect();
сейчас, это здорово. Но что, если вопрос может быть бессмысленным? Ну, один из подходов - вернуть пустой прямоугольник или другое значение «флаг».
Дополнительно вы можете сообщить, что он может вернуть прямой или ничего, а не использовать пустой прямоугольник для состояния «ничего». Он возвращает значение null.
int GetValue();
- лучший пример. Недопустимое значение может использовать состояние флага int - say -1
- но это заставляет каждого пользователя вашей функции искать и отслеживать состояние флага, а не случайно относиться к нему как к нормальному состоянию.
Вместо этого optional<int> GetValue()
дает понять, что он может не работать, и. Если он заполнен, вы знаете, что это реальное значение, а не значение флага.
В обоих случаях возврат указателя, не являющегося владельцем, является нежизнеспособным, поскольку кто владеет хранилищем? Возвращение указателя на владельца дорого, потому что бессмысленные распределения кучи бессмысленны.
Опция - это типы значений с нулевым значением. Когда вы хотите управлять ресурсами локально, и вы все еще хотите пустое состояние, они дают понять.
Еще одна вещь, которую нужно изучить, - предлагаемый тип expected
. Это необязательно, но когда в пустом состоянии содержится причина, почему она пуста.
Как насчет того случая, когда функция 'find' возвращает тип значения, например. 'int' или' double'? – CompuChip
Кроме того, из вашего связанного вопроса http://stackoverflow.com/a/14360932/2920343 – CompuChip
@CompuChip Это имеет смысл? Вы просто вернете двойную ценность? Если вы хотите, чтобы пользователь имел возможность редактировать отдельный двойной номер в памяти, принадлежащей SomeClass, тогда вы снова вернете double *. – nappyfalcon