Насколько я знаю, рекомендуется использовать функции, не являющиеся членами, не являющимися членами, когда это возможно, поскольку это отделяет алгоритмы, работающие с классом, от его частных полей. Используя эту логику c, мы, вероятно, реализовали бы std::optional<T>::value()
как что-то вроде
template<typename T> T& value(std::optional<T>& optional) {
if (optional.has_value()) {
return *optional;
} else {
throw std::bad_optional_access("empty optional");
}
}
Однако value()
является функцией-членом. Почему? Тот же вопрос можно применить к std::optional<T>::value_or()
.