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

Должен ли я вернуть bool или const bool?

Что лучше:

bool MyClass::someQuery() const;

const bool MyClass::someQuery() const;

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

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

4b9b3361

Ответ 1

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

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

Здесь приведен пример

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

if( (a * b) = c ) // declaring operator * return value const causes error to be caught by compiler

Ответ 2

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

Ответ 3

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

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

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

Ответ 4

Чтобы быть более конкретным, только "объекты" могут быть const. Стандартное определение "объект" С++ включает в себя все значения lvalue ( "имеет имя" ) и временные ряды класса. Логическое возвращаемое значение - это значение типа non-class, поэтому компилятор, совместимый со стандартами, в этом случае просто игнорирует "const". Как уже говорили другие, в этом контексте это бесполезно.

Ответ 5

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

Ответ 6

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

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

Ответ 7

Это совершенно неважно. Поэтому консенсус должен вернуть только bool.

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

Ответ 8

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

Ответ 9

const return type

РЕЗЮМЕ:

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

Ответ 10

const bool func();
bool f = func();

0 ошибок, 0 предупреждений. Что вы сделали, кроме ненужной инфляции кода?

Ответ 11

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