在C++中从double/int/string自动转换为bool

sas*_*uke 2 c++ boolean

我是一名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
*/
Run Code Online (Sandbox Code Playgroud)

TIA,
佐助

Ker*_* SB 9

指针和整数以及布尔值是不可或缺的类型.前三个都是指针或整数,因为它们都是非零的,所以它们转换为布尔值true.类型的第四个值double转换为零积分值,因此false.

不能表示为整数值(如无穷大和NaN)的双精度转换未定义.

有关详细信息,请参阅4.9;有关"布尔转换",请参阅4.12:

算术,无范围枚举,指针或指向成员类型的指针的prvalue可以转换为bool类型的prvalue.零值,空指针值或空成员指针值转换为false; 任何其他值都转换为true.

0.0的算术类型为零值.

也许您可能不熟悉C++中的字符串文字:""表示数组char[1] { 0 },并且此数组(一个元素)衰减到指向其第一个元素的指针,该元素必然是非空指针.类似地,"asdf"表示一个数组char[5] { 'a', 's', 'd', 'f', 0 },并且它再次衰减到指向其第一个元素的(非空)指针.角色的实际价值完全无关紧要.

  • @sasuke:这并不复杂,如果你想做一个准确的陈述,只是有点拗口.大多数真正的C++程序员都有一个心理快捷方式,所以当他们看到一个字符串文字时,他们会立即想到"指针",但有时候准确是很重要的. (2认同)