Почему бросание int в bool дает предупреждение?

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

Пример:

MSVС++ 8

bool bit = static_cast<bool>(100);

Ответ 1

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

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

bool result = int_value != 0;

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

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

int result = condition ? 1 : 0;

Ответ 2

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

i != 0

предпочитая либо:

(bool)i

или

static_cast<bool>(i)

Возможные причины его предпочтения включают:

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

Ответ 3

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

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

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

Ответ 4

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

bool result = int_value != 0;

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