Подтвердить что ты не робот

Должен ли я использовать noexcept для геттеров всегда?

Должен ли я использовать модификатор метода noexcept для getters всегда в С++ 11?

Я имею в виду простые getters, которые просто возвращают участников. По крайней мере, во всех моих получателях я имею здесь исключение не может быть брошенным. Один недостаток заключается в том, что геттер становится слишком многословным:

const std::string& getName() const noexcept{ return name; }

Хорошая сторона, указанная в книге Stroustrup, заключается в том, что компилятор может делать некоторые оптимизации здесь и там.

4b9b3361

Ответ 1

noexcept - это обещание, которое очень сложно вернуть. Например, позже вы можете сделать что-то так же просто, как изменить тип возвращаемого значения на std::string (по какой-либо причине), но поскольку ему нужно выделить копию строки, он может выдать.

Итак, стандарт пошел по пути "добавить noexcept только тогда, когда это необходимо или очень полезно", и я считаю, что это правильное правило. Вопрос, который вам нужно задать самому себе, будут ли вызывающие этого метода не бросать?

Ответ 2

Если есть хороший шанс, что кому-то понадобится этот noexcept-классификатор, я бы добавил его. Если вы не добавите его, у вас будет больше возможностей для изменения реализации (помните, что это обычный аргумент для setter/getter [и я не поклонник setter и getters]).

Вам обычно нужна эта гарантия "без броска", если вам нужно вызвать эту функцию в ситуации "откат, восстановление после ошибки". Например, если вы хотите называть это деструктором, тогда ваша жизнь будет проще, если она предложит гарантию nothrow (и noexcept - это современный способ предложить это).

Итак, я бы не сделал общее правило, чтобы добавить его.