Работает для любого типа, который может быть оценен в логическом контексте.Итак, арифметические типы, типы указателей (включая указатель на (член) (функцию)) и все, что угодно с преобразованием в один из них.Плюс шансы и окончания, такие как enum типы, std::nullptr_t
, и, возможно, что-то еще, что я забыл.4/3 в C ++ 11 определяет, что контекстно преобразуется в bool , и это то, что делает встроенный operator!
.
Для всех этих типов, написание if(!!n)
избыточно, вы можете написать if(n)
с тем же значением.!!n
для таких типов означает то же самое, что и bool(n)
или static_cast<bool>(n);
.
. Это также работает для любого типа с перегруженным operator!
, который возвращает тип, который может быть преобразован в bool (или который возвращаеттип с operator!
перегружен для возврата bool
).
Если крайний левый operator!
возвращает тип, отличный от bool, тогда вы все равно сможете написать if(!!n)
, но !!
нене действует как преобразование в bool
.Он действует как преобразование в любой тип возвращаемого значения.