Должен ли я вернуть bool или const bool? - PullRequest
21 голосов
/ 18 сентября 2009

Что лучше:

bool MyClass::someQuery() const;

const bool MyClass::someQuery() const;

Я использую «const bool», так как я уверен, что помню, что слышал, что это «то, что делают целые» (например, для операторов сравнения), но я не могу найти доказательств этого нигде, в основном из-за сложности Google и Intellisense не помогают;) Кто-нибудь может это подтвердить?

Для меня возвращение значений const (это не просто bools) имеет больше смысла; это предотвратит изменение временных значений, что почти всегда будет ошибкой программиста. Я просто хочу кое-что подкрепить, чтобы я мог превозносить возвращаемые константные значения моим коллегам:)

Ответы [ 11 ]

34 голосов
/ 18 сентября 2009

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

27 голосов
/ 18 сентября 2009

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

У вас есть копия "Эффективного C ++" Скотта Мейерса? Направьте их на пункт 3 (стр. 18 в третьем издании);)

Это дает пример

class Rational {...};
const Rational operator* (const Rational& lhs, const Rational& rhs );

if( (a * b) = c ) // declaring operator *'s return value const causes error to be caught by compiler
19 голосов
/ 18 сентября 2009

Обратите внимание, что if((a*b) = c) не будет компилироваться для встроенных типов в любом случае, поэтому здесь очень важно, говорим ли мы о встроенных типах (ваш вопрос требует bool) или пользовательские типы.

Для встроенных типов это не имеет никакого смысла, поэтому его не следует использовать. А для пользовательских типов я нахожусь в лагере Джальфа: что если вызывающая сторона хочет изменить возвращенный объект?

Я не уверен, что if((a*b) = c) - хороший аргумент для возврата пользовательских типов const, поскольку я не могу вспомнить, когда в последний раз видел компилятор , а не , предупреждающий об этом ,

16 голосов
/ 19 сентября 2009

Чтобы быть немного более конкретным, только "объекты" могут быть постоянными. Определение «объекта» в стандарте C ++ включает в себя все, на что ссылается lvalue («имеет имя»), и временные файлы класса. Булево возвращаемое значение - это значение не-классового типа, поэтому совместимый со стандартами компилятор в этом случае просто проигнорирует «const». Как уже говорили другие, в этом контексте это бесполезно.

14 голосов
/ 18 сентября 2009

Когда вы возвращаете ссылку на переменную-член, имеет смысл сделать ее константой.Здесь вы возвращаете копию, следовательно, нет необходимости в const.

7 голосов
/ 18 сентября 2009

Модификатор const используется только для типов возврата, которые возвращаются по ссылке (либо как ссылка const SomeObject&, либо через указатель const SomeObject*), поэтому вызывающая сторона не сможет изменить объект с помощью ссылки / указателя. Примитивные типы возвращаются значением , что означает, что вызывающая сторона получает копию объекта, а не сам объект.

Следовательно, const не совсем подходит для типов возвращаемых значений. Поскольку копия находится вне контроля вызываемой функции, вызываемая функция не должна диктовать вызывающей стороне, что ее нельзя изменить.

2 голосов
/ 18 сентября 2009

Поскольку bool будет скопирован, то же самое, положить const или нет. Кроме того, у вас могут возникнуть проблемы с компиляцией.

2 голосов
/ 18 сентября 2009

Это совершенно не имеет значения. Следовательно, консенсус заключается в том, чтобы вернуть только bool.

Причина, по которой это не имеет значения, заключается в том, что вы все равно не можете вызывать неконстантные функции-члены; bool не является классом или структурой.

1 голос
/ 18 сентября 2009

тип возврата const

РЕЗЮМЕ:

Значение возвращаемого типа объявленное const не может быть изменено. это особенно полезно при ссылка на внутреннюю часть класса, но может также предотвратить более редкие ошибки.

0 голосов
/ 27 ноября 2017

Это древний пост, но я думаю, что стоит упомянуть, что здесь есть потенциальный угловой случай, начиная с C ++ 11. Хотя, как утверждают другие, не имеет значения, используете ли вы const bool или bool в качестве типа возвращаемого значения в большинстве случаев, если вы используете C ++ 11 decltype и его партнеры, например, result_of, вы можете объявить переменную того же типа, что и возвращаемое значение некоторой функции, и поэтому const действительно будет иметь эффект в этом случае.

...