C ++ !!转换为布尔

时间:2011-11-11 09:21:41

标签: c++ if-statement conditional-statements

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

int n = 12;

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

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

5 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分: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)。< / p>

如果最左边的operator!返回bool以外的类型,那么您仍然可以编写if(!!n),但!!不会转换为bool }。它可以作为对返回的任何类型的转换。

答案 2 :(得分:3)

其他答案对你的实际问题有好处。

但是,如果您打算使用示例中的代码来“简化”代码(因为它会缩短代码),我想我会建议您不要这样做。相反,简化含义并检查整数为零而不是整数的双重否定。

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

明确地针对零进行测试具有独立性的好处,即你是否记得c ++中使用的“零是假”约定。请参阅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
  }

答案 3 :(得分:2)

唯一的限制是某种类型的对象应该可以转换为bool或整数类型。

例如,无法转换下一个类型:

struct A
{
  int a;
  float b;
};

但接下来可以:

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

答案 4 :(得分:0)

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

修改

假设运算符!的重载实例被实现为逻辑not