c++ - 当使用 bool 值构造字符串对象时,发生了什么类型转换?

标签 c++ string constructor type-conversion

在我的代码中,有一个拼写错误:在初始化 std::string 对象时,我没有使用 "false",而是输入了 false(这是一个 bool)。现在这并没有报告任何编译错误。但稍后在我的代码中,当使用这个字符串对象时,我在运行时得到 std::logic_error。谁能解释一下,为什么在这种情况下允许构造(否则我会收到编译错误并在那里发现问题)?

这是一个小片段-

#include <iostream>

int main ()
{

   std::string str = false;

   std::cout << str << "\n";

}

我在运行时得到的 o/p -

xhdrdevl8@~/MYBACKUP=>g++ -o test_string -g test_string.cxx

xhdrdevl8@~/MYBACKUP=>./test_string

terminate called after throwing an instance of 'std::logic_error'
  what():  basic_string::_S_construct NULL not valid
Aborted

最佳答案

std::string 有一个构造函数,它接受一个 const char* 到一个以 null 结尾的字符串。

false 可以用作空指针常量,因为它是一个值为零的整型常量表达式,所以使用了这个 std::string 构造函数。

将空指针传递给此构造函数会产生未定义的行为。您的标准库实现通过生成 logic_error 异常来帮助您解决此问题,以通知您您通过向构造函数传递空指针违反了 std::string 的约束。其他实现可能没有那么有用(您可能会立即崩溃或数据损坏或谁知道会发生什么)。

关于c++ - 当使用 bool 值构造字符串对象时,发生了什么类型转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4801184/

相关文章:

wcf - WCF 服务的构造函数是否应该使用错误进行错误处理?

java - 为什么 super() 构造函数不采用与父构造函数相同的参数?

c++ - 类型名称后面的括号是否与new有所不同?

c++ - Arduino:尝试将 Char[] 转换为字符串时为空字符串

C++ 枚举模板偏特化

java - 带多个空格的分割线

python - 使用 Pandas 从数据框的所有项目中删除字符串

c++ - 我如何确定将完成返回值优化

c++ - 定义超过 50 行的 boost msm 状态机

java - Java 中的字符串字谜