2012-07-28 2 views
0
bool image_manager::contains_image(const std::string& filename) 
{ 
    return this->map_.count(filename); 
} 

Теперь предупреждение, которое я получаю:Зачем мне это предупреждение на MSVC?

warning C4800: 'unsigned int' : forcing value to bool 'true' or 'false' (performance warning) 

Однако, так как тип возвращаемого std::map посчитает() метод:

1, если элемент с ключом, эквивалентным х является найдено, или ноль в противном случае.

Следовательно, его можно использовать в основном как логическое. Так почему именно я получаю это предупреждение? В C++ целые числа могут в основном использоваться для булевых проверок правильно? Следовательно, 0 == false и 1 == true. Так почему компилятор бросил мне предупреждение? Я также попытался с помощью static_cast так:

return static_cast<bool>(this->map_.count(filename)); 

, но я все еще получаю предупреждение.

+1

Я не сейчас _why_, но вы можете удалить предупреждение с помощью check ('return map_.count (filename)! = 0;'). –

+0

Я предполагаю, что их bool не работает так же хорошо, как int. – chris

+0

@chris, но я всегда думал, что 'bool' был просто перечислением или' typedef'ed 'int'. Что-то вроде 'enum bool {false = 0, true = 1};'? – ApprenticeHacker

ответ

2

В общем, unsigned int не является bool, поэтому предупреждение. Попробуйте:

return this->map_.count(filename) > 0; 

вместо этого.

+1

-1 все равно должен быть правдой с точки зрения bool. Все, что не равно 0, истинно. – chris

+1

@chris true в целом, но это зависит от конкретного приложения. Здесь явно '> 0' достаточно ... – Simon

+0

@chris Woops, это странно предупреждать о явном преобразовании. Обратите внимание, что unsigned int не может быть '-1', а' map :: count' может возвращать только 0 или 1. – Potatoswatter

0
size_type count (const key_type& x) const; 

prvalue арифметики, незаданного перечисления, указатель, или указателя на типа элемента может быть преобразован в prvalue типа BOOL. Нулевое значение, Значение нулевого указателя или значение указателя нулевого элемента преобразуется в false; любое другое значение преобразуется в значение true. Значение типа std :: nullptr_t может быть преобразовано в prvalue типа bool; итоговое значение является ложным.

Стандартная программа хорошо сформирована и должна работать на всех компиляторах, поддерживающих стандарт.

+1

Это нормально, чтобы дать предупреждение, стандарт ничего не говорит об этом. Рассмотрение предупреждений как ошибок приводит к тому, что любой компилятор является несовместимым. – Potatoswatter

+0

@ Портативный источник фиксированный. – ForEveR

+0

ehhmm weird fix. То, что он хотел сказать, заключается в том, что стандарт не принуждает компиляторов о том, какие предупреждения он должен/не должен испускать. –

Смежные вопросы