Это правило связывает вас, если вы когда-либо захотите использовать класс с неявным преобразованием в bool
, например std::istream
. Этот код читает слово в то время из файла до EOF не будет достигнут: оператор добычи
std::ifstream file("foo.txt");
std::string word;
while (file >> word)
{
// do stuff
}
потока возвращает ссылку на поток файла, который неявно преобразуется в bool
, чтобы указать, является ли поток все еще в хорошее состояние. Когда вы дойдете до конца файла, тест завершится с ошибкой. Ваш стандарт кодирования не позволяет использовать эту общую конструкцию.
Для типов указателей это не имеет большого значения. Компилятор, вероятно, будет создавать примерно тот же код для неявного преобразования в bool
и явный тест против NULL
. Это вопрос вкуса в этот момент - ни один из них не «лучше» в абсолютном смысле. Стандарт кодирования просто пытается обеспечить согласованный стиль.
Учитывая это, вы должны абсолютно следовать стандарту кодирования при работе со встроенными типами (указатели, int и т. Д.). Если вы столкнетесь с аналогичной ситуацией с вышеизложенным классом, имеющим законное преобразование в bool
, я бы поднял проблему с вашими товарищами по команде.
Да, худшее, что кто-то следует за ним, а другие нет –
Да, вы можете полагаться на неявные преобразования на' bool', так же как вы можете полагаться на приоритеты операторов, даже когда компилятор предлагает вам добавить избыточные скобки (для обоих случаев он считает, что существует нулевая проблема способность правил будет когда-либо изменяться). Вы даже можете полагаться на неявные преобразования, чтобы bool приходил и укусил вас всякий раз, когда вы забываете разыменовывать указатель в позиции, где по какой-то причине, например, перегрузка значения «bool» также имеет смысл. –