为什么将布尔值隐式转换为字符串不是错误?
Why implicit conversion of bool to string isn't an error?
我用google &试图在SO上找到类似的问题,但没有找到任何有用的。所以,把我的问题贴在这里。
考虑这个程序:
#include <iostream>
void foo(const std::string &) {}
int main()
{
foo(false);
}
<>之前[警告]将'false'转换为'std::basic_string::basic_string(const _CharT*, const _Alloc&) [with _CharT = char;_Traits = std::char_traits;_Alloc = std::allocator]' [-Wconversion-null]之前为什么c++允许在没有显式强制转换的情况下这样做?我期待得到编译错误。由于显示以下异常,程序在运行时异常终止:
terminate called after throwing an instance of 'std::logic_error'
what(): basic_string::_S_construct null not valid
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
标准对这种类型的隐式转换有什么规定?
在c++ 11引入nullptr
关键字之前,空指针是一种hack。任何等于0的整数字面值都可以作为空指针常量,false
符合要求。
因此,您的程序的效果是用NULL
的char const *
参数构造std::string
。构造函数不支持空指针,因此会得到未定义的行为。
这个问题的解决方案是使用c++的一种较新的方言。如有必要,将-std=c++11
或-std=c++14
传递给编译器。然后你应该得到这样的内容:
http://coliru.stacked-crooked.com/a/7f3048229a1d0e5aerror: no matching function for call to 'foo'
EDIT:嗯,GCC似乎还没有实现这个改变。这有点令人惊讶。你可以试试Clang。
我已经提交了一个bug报告。
实际情况是,std::string
是由false
隐式构造的,使用const CharT*
重载并将false
转换为空指针。根据该构造函数的文档:
如果
s
[指针]不指向至少包含CharT
的Traits::length(s)+1
个元素的数组,则该行为是未定义的。
因此出现了故障(以友好异常的形式出现,但不要依赖它)。
现在,是正确的吗?根据[convr .ptr]:
空指针常量是一个值为0或类型为
std::nullptr_t
的整型字面值(2.13.2)。
false
确实有一个值为0,但不是一个整数字面值(它是一个布尔字面值)。因此,std::string
的构造函数所接受的到CharT*
的隐式转换是非标准的。
事实上,当GCC发出警告时,Clang拒绝编译它。
bool基本上是一个整数所以它会被解释为0,在你的例子中它可能是0字符这会导致这个问题字符串会出现异常
- C++函数的字符串错误"find_first_of"
- 流字符串错误输出
- 在图像上覆盖文本的程序会产生无休止的字符串错误
- 字符串错误的向量
- C++字数统计程序使用C字符串错误在程序运行后
- 从函数返回字符串C++错误
- 字符串错误或编译器错误
- SQL 字符串错误?没有这样的列
- C/C++ 字符串错误与 ARM SEG 故障总线错误
- 字符串错误输出
- C++调用堆上的类(空字符串错误)
- 运行时字符串错误C++
- 字符串递归函数中的字符串错误
- 从文本文件/文本流中读取Q字符串错误
- 动态内存c++程序中的字符串错误
- 发现c++正则表达式子字符串错误模式
- 在Cocos2d-x中比较字符串错误
- c++读TXT到字符串错误
- 字符串错误检查
- Chromium嵌入式框架VS2013字符串错误