C++字符串(常量字符[1])到布尔类型的转换 - 原因/解释和后果
C++ string (const char[1]) to bool type conversion - reason/explanation and consequences
看看下面的C++代码:
// imagine 10.000 lines if C++ here
bool test() {
// imagine 300 loc here
return "";
}
int main(int argc, char** argv) {
bool whaaaaaat = test();
return 0;
}
编译这些行时,结果为:
BUILD SUCCESSFUL (total time: 208ms)
甚至没有警告!
请确认:
- " 被编译器视为 char[1] 又名 char* C++
- 然后将其转换为布尔值
- 总是 != 0 => 总是正确的
问题:当程序继续时,是否会对程序的状态产生任何负面影响(内存损坏?
这种设置真的很危险,编译器至少应该给出警告!
你基本上是对的。
字符串文字char const[1]
将衰减为char const*
,与任何指针一样,布尔化将告诉您它是否为 null。这个不是。
我通常倾向于同意这种隐式转换是危险的,但这只是因为你的程序的行为可能不是你想要的。没有"破碎的记忆"。
" 被编译器视为 char[1] 又名 char* C++
用非常不准确的术语来说,是的。更准确地说,""
是一个const char[1]
,常量字符数组可以衰减到指向第一个(仅在这种情况下)字符的const char*
。
然后将其转换为布尔值
总是 != 0 => 总是正确的
完全是的,对两者都有。
问:当程序继续时,是否会对程序的状态产生任何负面影响(内存损坏?
没有损坏的记忆或任何其他负面影响。行为是明确定义的。此函数实际上相同:
bool test() {
"";
return true;
}
这种设置真的很危险
我不同意。最多没意义。
问题是关于一个返回始终为 true 的函数,没有任何编译器的警告或错误,这只是精简示例。
我认为这不需要警告,更不用说错误了。
考虑一个接口,它是对不同类型进程的抽象,在成功时返回 true。现在考虑实现该接口,知道您的简单过程永远不会失败,因此始终返回 true。编译器是否应该阻止您编写此类实现?它甚至应该用警告来纠缠你吗?在我看来不是。
您认为GDB可能会受到影响吗?
不。
""
被编译器视为char[1]
C++又名char**
""
被视为一个常数char
的数组。它与char*
不同,尽管在某些情况下它可以转换为const char*
(常量是特定于C++的)。
然后将其转换为始终
!= 0
=> 始终true
的bool
在这两点上都正确。
当程序继续时,是否会对程序的状态产生任何负面影响(内存损坏?
这绝对没有任何后果:没有内存泄漏,没有悬空的指针或其他不好的事情。
没有负面影响,只是糟糕(太难理解)的编码风格。我在多年的旧工作项目中看到了这样的代码
assert(somethingIsRight && "Something is wrong!");
它被很好地定义为布尔转换(隐式转换之一):
整数、浮点、无作用域枚举、指针、 并且指向成员的指针类型可以转换为类型的 prvalue 布尔。
值零(对于积分、浮点和无作用域 枚举)和空指针和空指针指向成员 值变为假。所有其他值都变为 true。
对于您的代码,""
可能会衰减到指针(即 const char*
) 不为空,因此结果将为 true
。对于指针,它只是检查它是否为 null 并返回一个true
或false
的bool
,它会没问题(没有"损坏的内存":))。
- 无法转换类型 C++
- 包含可变参数包的第一个可转换类型的别名的结构
- 将 std::conditional 与不可转换类型(原始与指针)一起使用
- 链接方法时出现转换类型错误
- 如何避免隐式转换类型
- 在多重继承场景中动态强制转换类型
- 编译器不支持的转换类型
- 错误调用功能无法转换类型
- 我想看到一个在整个后缀表达式的上下文中查找转换类型 id 的示例
- 对于动态类型为强制转换类型的对象,dynamic_cast失败
- 无法在初始化中转换类型
- 如何让"auto"转换类型
- 如何通过强制转换类型指针将字符数组转换为uint16_t
- 如何从新运算符+(Template类)返回具有转换类型的对象
- 带有模板的基于枚举的工厂无法转换类型
- 使用SWIG类型映射通过字符串转换类型
- 对于可转换类型,设计比循环依赖项更好
- SWIG不能正确转换类型定义
- 将类型转换扩展到可转换类型的对/元组
- 想要将字符数组的部分转换/类型转换为值