c++中从double/int/string到bool的自动转换

Automatic conversion from double/int/string to bool in C++

本文关键字:转换 bool string 中从 double int c++      更新时间:2023-10-16

我是一名Java程序员,一直在努力学习一点c++,以扩展我的知识。这里是一个小代码片段,我认为由于隐式转换工作,但我想知道它指的是规范的哪一部分,以及当涉及到隐式转换时,我必须意识到的其他规则是什么。是否有文件/链接/网站规定了隐含的转换规则?

#include <vector>
#include <iostream>
#include <iterator>
int main(void) {
  using namespace std;
  vector<bool> a;
  a.push_back("asdf");
  a.push_back("");  
  a.push_back(12);  
  a.push_back(0.0);  
  copy(a.begin(), a.end(), ostream_iterator<bool>(cout, "n"));
  return 0;
}
/*
output:
1
1
1
0
*/

TIA,
佐助

指针、整数和布尔值都是整型。前三个都是指针或整数,由于它们都是非零的,因此它们转换为布尔值truedouble类型的第四个值转换为零积分值,因此false

不能表示为整型值(如infinity和NaN)的双精度浮点数的转换是未定义的。

详情见4.9,"布尔转换"参见4.12:

算术、无作用域枚举、指针或指向成员类型的指针的右值可以转换为bool类型的右值。零值、空指针值或空成员指针值被转换为false;其他值都被转换为true。

您的0.0是一个算术类型的零值。

您可能不熟悉c++中的字符串字面值:""表示数组char[1] { 0 },并且该数组(只有一个元素)衰变成指向其第一个元素的指针,该指针必须是非空指针。类似地,"asdf"表示数组char[5] { 'a', 's', 'd', 'f', 0 },并且再次衰减为指向其第一个元素的(非空)指针。字符的实际值完全无关紧要。

所有基类型都可以隐式地转换为bool。非0TRUE, 0FALSE

对于用户定义的类型,如果使用指针,任何非NULL的值都计算为TRUE,否则计算为FALSE

如果你使用对象实例而不是指针,你需要声明operator bool():

class A
{
public:
   operator bool() {return false;};
};
//....
A a;
if ( a ) //compiles because of the operator
   //...;