Как корректно реализовывать функции-геттеры? Я имею ввиду возвращаемое значение. Так:
std::shared_ptr<const number_t> number () const noexcept
{
return std::make_shared<const number_t> (this->m_number);
}
Или так (в стиле vector::at):
const auto & number () const noexcept
{
return this->m_number;
}
m_number - поле пользовательского типа, а не стандартного.
Какой вариант считается хорошим стилем сейчас / безопаснее / более удобен и т.п.?
Умный указатель нужен только в том случае, если у нас есть переменная, лежащая в куче, и надо безопасно управлять её временем жизни (то есть с одной стороны не допустить утечки, а с другой — не уничтожить эту переменную раньше времени; именно отсюда и растут ноги понятия «владение» — переменная будет уничтожена только при уничтожении её текущего владельца).
В вашем же случае значение не является какой-то уникальной сущностью, а потому ничего страшного в создании дубликата не будет — мы не различаем между собой оригинальное число и его копию. Поэтому спокойно возвращайте величину по значению, без константных ссылок и указателей.
Я вам больше скажу — компилятор влёгкую оптимизирует возврат значения. Если это примитивный тип, то он просто записывается в регистр процессора; если нет — применяется RVO (оптимизация возвращаемого значения, частный случай copy elision, о котором я писал в одном из своих ответов).
Возврат по указателю (неважно, обычному или умному) нужен только в том случае, когда мы работаем с сущностями. К примеру, копия графического элемента управления (GUI control) или объекта в игровом мире — это уже новые объекты, не имеющие отношения к своим оригиналам.
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости