我是一名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,
佐助
答案 0 :(得分:9)
指针和整数以及布尔值是整数类型。前三个都是指针或整数,因为它们都是非零的,所以它们转换为布尔值true
。类型double
的第四个值转换为零积分值,因此false
。
未定义无法表示为整数值(如无穷大和NaN)的双精度转换。
有关详细信息,请参阅4.9;有关“布尔转换”的信息,请参阅4.12:
算术,无范围枚举,指针或指向成员类型的指针的prvalue可以转换为a bool类型的prvalue。零值,空指针值或空成员指针值转换为false; 任何其他值都转换为true。
您的0.0
是零值的算术类型。
也许您可能不熟悉C ++中的字符串文字:""
表示数组char[1] { 0 }
,并且此数组(一个元素)衰减为指向其第一个元素的指针,该元素必然是非空指针。类似地,“asdf”表示数组char[5] { 'a', 's', 'd', 'f', 0 }
,并且它再次衰减到指向其第一个元素的(非空)指针。角色的实际价值完全不重要。
答案 1 :(得分:2)
所有基类型都可以隐式转换为bool
。任何非0
的内容都是TRUE
,而0
是FALSE
。
对于用户定义的类型,如果使用指针,任何非NULL的值都将计算为TRUE
,否则为FALSE
。
如果使用对象实例而不是指针,则需要声明operator bool()
:
class A
{
public:
operator bool() {return false;};
};
//....
A a;
if ( a ) //compiles because of the operator
//...;