Должен ли я возвращать bool или const bool?
-
22-07-2019 - |
Вопрос
Как лучше:
bool MyClass::someQuery() const;
const bool MyClass::someQuery() const;
Я использовал 'const bool', так как я уверен, что помню, что слышал, что это "что делают целые числа" (например,операторы сравнения), но я нигде не могу найти доказательств этого, в основном из-за того, что Google сложно, а Intellisense ничем не помогает;) Может ли кто-нибудь это подтвердить?
На мой взгляд, возврат константных значений (речь идет не только о логических значениях) имеет больше смысла;это предотвратит изменение временных объектов, что почти всегда является ошибкой программиста.Мне просто нужно что-то, подтверждающее это, чтобы я мог превозносить возвращение константных значений своим коллегам :)
Решение
То есть, ты знаешь, что это правильно, ты только после Голоса Власти?
Предотвращение случайного изменения временных показателей очень ценно. В общем, вы должны объявить как можно больше вещей 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
Другие советы
Это тот случай, когда const
не добавляет значения, но раздувает код и заставляет читателя думать дальше. Какой смысл в этом const
? Вызывающая сторона может скопировать значение в некоторую неконстантную переменную и в любом случае сделать с ней все, что захочет.
Обратите внимание, что if ((a * b) = c)
выиграл ' В любом случае t компилировать для встроенных типов, поэтому здесь очень важно, говорим ли мы о встроенных типах (ваш вопрос требует bool
) или пользовательских типах. Р>
Для встроенных типов это не имеет никакого смысла, поэтому его не следует использовать. А что касается пользовательских типов, я нахожусь в лагере Джальфа: что если вызывающая сторона хочет изменить возвращенный объект? Р>
Я не уверен, что if ((a * b) = c)
является таким хорошим аргументом для возврата константных пользовательских типов, так как я не могу вспомнить последний раз, когда я ' мы видели, как компилятор not предупреждал об этом. Р>
Чтобы быть немного более конкретным, используйте только "объекты" может быть постоянным Определение в стандарте C ++ «объекта» включает в себя все, на что ссылается lvalue («имеет имя») и временные файлы типа класса. Возвращаемое логическое значение - это значение не относящегося к классу типа, поэтому совместимый со стандартами компилятор будет просто игнорировать " const " в этом случае. Как уже говорили другие, это бесполезно в этом контексте.
Когда вы возвращаете ссылку на переменную-член, имеет смысл сделать ее константой. Здесь вы возвращаете копию, следовательно, нет необходимости в const.
Модификатор const
используется только для возвращаемых типов, которые возвращаются по ссылке (либо как ссылка const SomeObject & amp;
, либо через указатель < code> const SomeObject * ), поэтому вызывающая сторона не сможет изменить объект с помощью ссылки / указателя. Примитивные типы возвращаются по значению , что означает, что вызывающая сторона получает копию объекта, а не сам объект.
Следовательно, const
не совсем подходит для типов возвращаемых значений. Поскольку копия находится вне контроля вызываемой функции, вызываемая функция не должна диктовать вызывающей стороне, что ее нельзя изменить. Р>
Это совершенно неважно. Следовательно, консенсус заключается в возвращении только bool
. Р>
Причина, по которой это не имеет значения, заключается в том, что вы все равно не можете вызывать неконстантные функции-члены; bool
не является классом или структурой.
Поскольку bool будет скопирован, то же самое, положить const или нет. Кроме того, у вас могут возникнуть проблемы с компиляцией.
константный тип возвращаемого значения
КРАТКОЕ СОДЕРЖАНИЕ:
Значение возвращаемого типа объявленный const не может быть изменен.Этот особенно полезно при ссылка на внутреннее устройство класса, но также может предотвратить более редкие ошибки.
const bool func();
bool f = func();
0 ошибок, 0 предупреждений. Чего вы добились, кроме ненужного взвинчивания кода?
Это древний пост, но я думаю, что стоит упомянуть, что здесь есть потенциальный случай с C ++ 11. Хотя, как утверждают другие, не имеет значения, используете ли вы const bool
или bool
в качестве типа возврата в большинстве случаев, если вы используете C ++ 11 decltype
и партнеры, например result_of
вы можете объявить переменную с помощью того же типа, что и возвращаемое значение некоторой функции, поэтому const
в этом случае будет иметь эффект.