c++ ! !转换为bool类型
C++ !! conversion to bool
在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
实现。
- 为什么在这种情况下,bool 类型的输出等于 0?
- 如何告诉自动推断向量<bool>元素的非引用类型
- 错误:数组下标的类型"const bool[int]"无效
- 具有C BOOL数据类型的奇怪行为
- 通过引用传递基元类型(如 int、bool)是否比按值传递有任何加速?还是会恶化时间/空间的使用
- boost::variant 当 bool 显示为可能的类型时,会给出错误的结果
- 比较C 中BOOL数据类型的比较
- 在使用C 中使用多个三元运算符时,BOOL和ENUM类型超载的功能没有区分
- 将“nullptr”分配给“bool”类型.哪个编译器是正确的
- 在 lambda 表达式中自动推导出的类型是什么,用于修改 bool 类型的向量(特殊容器)
- 为什么 libcxx 的__dependent_type使用模板非类型参数 bool _Dummy
- C++错误:类型"bool"的标量初始值设定项两边的大括号
- 在模板参数中更改bool值的类型
- 创建一个类型bool的向量,其中所有值均可初始化为true
- 警告 634:相等或有条件的强类型不匹配(类型"bool")
- 使用类型"bool"类型的值初始化类型"int &"(非常量限定)的引用是否是一种黑客?
- C++中的内置类型bool或C中的stdbool.h类型将TRUE和FALSE定义为不是机器字的大小
- 运行时错误:加载值 127,该值对于类型 'bool' 无效
- 无法解决错误:对类型"bool"的非常量左值引用无法绑定到类型"bool"的临时
- 从私有成员值类型 (bool) 读取的 VC++ 访问冲突