C++ !! 转换为布尔

Den*_*vov 2 c++ if-statement conditional-statements

在C++中,有一种!!适用于非bool值的结构,可将其转换为bool.例如:

int n = 12;

if ( !!n )
  std::<<cout << "n is true";
else
  std::<<cout << "n is false";
Run Code Online (Sandbox Code Playgroud)

是否有可以应用的限制,或适用的类型:POD,指针等?

jal*_*alf 8

限制是operator!必须为类型定义(并且它必须产生一个operator!也定义的类型)

  • @Denis:以下类型是POD,但不适用于`!!`:`struct a {int b; };`.以下类型是POD,并且确实有效:`bool`.所以POD在这里不是一个有用的分类. (2认同)

Ste*_*sop 5

它适用于可在布尔上下文中计算的任何类型.算术类型,指针类型(包括指向(成员)(函数)),以及转换为其中之一的任何东西.加上枚举类型的可能性和结束std::nullptr_t,以及可能是我忘记的其他东西.C++ 11中的4/3定义了上下文转换为bool的含义,这就是内置operator!函数的作用.

对于所有这些类型,写入if(!!n)是多余的,您可以if(n)用相同的含义编写.!!n对于这些类型意味着与bool(n)或相同static_cast<bool>(n);.

它也适用于任何具有重载operator!的类型,它返回一个可以转换为bool的类型(或返回一个带有operator!重载的类型返回bool).

如果最左边operator!的类型返回bool以外的类型,那么你仍然可以写if(!!n),但!!不能作为转换bool.它充当转换为返回的任何类型.