C++ 当布尔值用于构造字符串对象时,会发生什么类型转换?

C++ 当布尔值用于构造字符串对象时,会发生什么类型转换?,c++,string,constructor,type-conversion,C++,String,Constructor,Type Conversion,在我的代码中,出现了一个错误:在初始化std::string对象时,没有使用“false”(这是bool)。现在它没有报告任何编译错误。但是在我的代码后面,当使用这个字符串对象时,我在运行时得到std::logic\u error。有人能解释一下,为什么在这种情况下允许这种构造(否则我会收到一个编译错误并在那里发现问题) 下面是一个小片段- #include <iostream> int main () { std::string str = false; std:

在我的代码中,出现了一个错误:在初始化
std::string
对象时,没有使用
“false”
(这是
bool
)。现在它没有报告任何编译错误。但是在我的代码后面,当使用这个字符串对象时,我在运行时得到
std::logic\u error
。有人能解释一下,为什么在这种情况下允许这种构造(否则我会收到一个编译错误并在那里发现问题)

下面是一个小片段-

#include <iostream>

int main ()
{

   std::string str = false;

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

}

std::string
具有一个构造函数,该构造函数将
const char*
转换为以null结尾的字符串

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


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

ok。但这不应该导致编译时错误吗?(而不是稍后在运行时捕获错误)@anidita:No.
false
可用作空指针常量(就像
0
is或
null
is,如果
#include
),空指针常量可用作
常量字符*
,因此可以使用采用
const char*
std::string
构造函数。
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