Почему приведение int к bool дает предупреждение? - PullRequest
14 голосов
/ 11 февраля 2011

Разве не следует использовать static_cast для преобразования int в bool, поскольку оно преобразует обратное неявное преобразование, но я все еще получаю предупреждение?

Пример:

MSVC ++ 8

bool bit = static_cast<bool>(100);

Ответы [ 4 ]

47 голосов
/ 11 февраля 2011

То, что преобразование a => b является неявным, ничего не говорит о жизнеспособности обратного, b => a.

В вашем случае вам вообще не следует разыгрывать.Просто сделайте очевидную вещь: сравните:

bool result = int_value != 0;

Это единственный логически правильный способ преобразования int в bool, и он делает код намного более читабельным (потому что он делает предположения явными).

То же самое относится и к обратному, кстати.Неявное преобразование из bool в int просто лениво.Сделайте отображение явным:

int result = condition ? 1 : 0;
9 голосов
/ 11 февраля 2011

Это между вами и вашим компилятором, но Microsoft считает, что вы должны написать:

i != 0

в предпочтении либо:

(bool)i

или

static_cast<bool>(i)

Возможные причины предпочтения:

  • это преобразование не действует как другие сужающиеся преобразования, которые принимают модуль,
  • последствия преобразования в bool также немного противоречивы: многие люди предпочитают делать if (buf != NULL) или if (buf != 0) вместо if (buf) после вызова malloc,
  • сравнение короче и четче.
3 голосов
/ 11 февраля 2011

Я не уверен, почему это происходит, когда вы явно приводите его (я думаю, что это было предупреждение о производительности?), Но я обычно использую такой код, чтобы избежать любых предупреждений:

int i;
bool b = (0!=i);

Это никогда не дает предупреждений.

0 голосов
/ 11 февраля 2011

Я делаю, как кто-то уже писал:

bool result = int_value != 0;

Это более простой способ для imo и более интуитивный, чем попытка привести целое число к bool.

...