c++中从double/int/string到bool的自动转换
Automatic conversion from double/int/string to bool in C++
我是一名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,
佐助
指针、整数和布尔值都是整型。前三个都是指针或整数,由于它们都是非零的,因此它们转换为布尔值true
。double
类型的第四个值转换为零积分值,因此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
。非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
//...;
相关文章:
- 显式 std::exception_ptr 转换为 bool 不存在.VS2010 错误?
- 从标准::字符串到标准::矢量<bool>的快速转换
- 从标准::未来<void>到非标量标准::未来<bool>引发的错误转换
- 如果类对象需要在 C++ 中转换为 int,为什么会调用 "operator bool()"?
- 从nullptr_t转换为bool:有效与否
- 为什么这个GitHub项目将字符串转换为bool
- 我无法将'2D array whit bool'转换为"空 2D 数组布尔值"(用于生命游戏)
- 错误:无法将"dirent*"转换为"search_directories(std::string, std::list<start_tournament_info_t*>&, bool)
- 无法将“ bool”转换为“ gzfile {aka gzfile_s*}”
- 防止在执行时将两个类中的两个对象转换为 bool:if(a!=b)
- C++变体用bool转换构造函数
- 为什么函数向bool存在隐式转换
- Bool 在 'std::rel_ops' 示例中进行强制转换
- 为什么显式 bool() 转换在上下文转换中不发生
- Visual Studio无法在布尔运算的上下文中实例化强制转换运算符模板(T=bool)
- 为什么C/C++会自动将char/wchar_t/short/bool/enum类型转换为int
- 错误 C2440: 'type cast':无法从 'bool' 转换为 'CString'
- C++11 无法将 std::condition_variable::wait 从 'void' 转换为 'bool'
- 为什么显式运算符 bool 允许我转换为任何基元类型
- 将位集数组转换为矢量<bool>