c++ ! !转换为bool类型

C++ !! conversion to bool

本文关键字:类型 bool 转换 c++      更新时间:2023-10-16

在c++中有一个适用于非bool值的结构!!,用于将其转换为bool值。例如:

int n = 12;
if ( !!n )
  std::<<cout << "n is true";
else
  std::<<cout << "n is false";

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

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

它适用于任何可以在布尔上下文中求值的类型。所以算术类型,指针类型(包括pointer-to-(member)(function)),以及任何可以转换为算术类型的东西。加上一些零碎的东西,比如枚举类型、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的转换。它充当到返回的任何类型的转换。

其他答案对您的实际问题很有帮助。

然而,万一你打算使用你的例子中的代码来"简化"你的代码(因为它使代码更短),我想我会建议你不要这样做。相反,应该简化含义并检查整数是否为零,而不是对整数进行双否定。

if (n!=0) 
    { 
      //whatever
    }

显式地对0进行测试的好处是,与您是否记得c++中使用的"0为假"约定无关。请参阅https://stackoverflow.com/q/329582/498253,以及下面的评论。

这是因为对我来说,if(!!my_int)不是很清楚——它不是很明显要发生什么,在这一点上形成一个分支看起来会引起问题。

上一段代码(以便非常有用的注释有意义)

bool my_bool = (n != 0) ? true : false; //whichever way you want it to work.
if (my_bool) 
  { 
    //whatever
  }

唯一的限制是该类型的对象必须可转换为bool或integer类型。

例如,next类型不能转换:

struct A
{
  int a;
  float b;
};

但下一个可以:

struct B
{
  int v;
  operator int()
  {
    return v;
  }
};

!!只是两次应用!运算符。它适用于所有可以使用!的表达式。

编辑:

操作符!的重载实例被假定为逻辑not实现。