在C ++中,有一个构造!!
适用于非bool值,可将其转换为bool。例如:
int n = 12;
if ( !!n )
std::<<cout << "n is true";
else
std::<<cout << "n is false";
是否有可以应用的限制,或适用的类型:POD,指针等?
答案 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
。