Что здесь происходит?Я даже не понимаю, почему предупреждение вызвано в первую очередь.Я думал, что первый бит кода уже все равно возвращает bool.
Потоки имеют оператор неявного преобразования, который возвращает void*
.(Это версия идиомы safe bool . Это сделано так, потому что есть меньше контекстов, в которых void*
компилируется, чем bool
, поэтому есть меньше контекстов, в которых неявное преобразование может вызвать нежелательное.) [1]
Streams 'operator>>()
возвращает ссылку на свой левый операнд - поток.Вот так вы можете связать операции ввода: strm >> value1 >> value2
выполняется как ((strm >> value1) >> value2)
.
Теперь, когда вы говорите if( strm >> value )
, strm >> value
выполняется и поток возвращается.Чтобы поместить это в оператор if
, выполняется неявное преобразование в void*
, и этот указатель затем проверяется на NULL
или нет.
Это ничем не отличается от if(ptr)
, if
оператор implicit преобразует свое условие в bool
, но компиляторы никогда не предупредят об этом, потому что условие, не являющееся bool
, является настолько распространенным.
С return
все по-другому.Если вы хотите вернуть определенный тип, обычно возвращаемое выражение должно быть этого типа.Предупреждение ВК довольно раздражает, и для меня в 99 из 100 раз это было излишним.Но оставшийся 1% (никогда не беспокоился о производительности, кстати, я думаю, что это глупо в отношении предупреждения) заставил меня порадоваться, что предупреждение есть.
Обходной путь для этого предупреждения:
return 0 != <expression>
, где <expression>
- это то, что, по вашему мнению, должно рассматриваться как логическое значение.
[1] ISTR Stroustrup пишет где-то, что operator bool()
будет молча компилироваться, если вы испортите операторы: ostrm >> 5;
(обратите внимание, >>
вместо <<
) будет компилироваться нормально, но молча делатьнеправильная вещь.(Он преобразует логическое значение в целое и смещает вправо 5 раз, а затем отбрасывает значение.)