用bool类型初始化std::string

3

考虑以下初始化:

std::string falseString = false;
std::string trueString = true;

使用g++ 5.2.0编译器,对于falseString会产生警告,而对于trueString则会报错。

使用clang++ 3.6 -std=c++11编译器,对于falseStringtrueString都会报错。

问题1:为什么gcc的行为不同,即使两个初始化值都是相同的类型(bool)?

问题2:哪个编译器是正确的,为什么?标准规定了什么?

编辑:

错误:从 'bool' 到 'std::string'(也就是 'basic_string')没有可行的转换

警告:将 'false' 转换为指针类型作为参数1传递给 'std::__cxx11::basic_string<_CharT, _Traits,_Alloc>::basic_string(const _CharT*, const _Alloc&) [with _CharT = char; _Traits = std::char_traits; _Alloc = std::allocator]' [-Wconversion-null]


告诉我们警告/错误的内容可能是一个线索...?你是故意省略了它们吗? - Lightness Races in Orbit
主要历史性 - https://dev59.com/B47da4cB1Zd3GeqP8hcc - Cory Kramer
1个回答

6
首先,你绝不能从true初始化std::string。那是毫无意义的。
GCC 5.2接受从false初始化,但会发出警告,因为它曾经是一个有效的空指针字面量。是的。比较C++03和C++11之间的3.9.1/6——“如下所述,bool值的行为类似于整数类型”被删除了。
现在这两个编译器都应该报错,但是直到一个月前(因此是GCC 6.0),GCC在这方面有缺陷

所以正如预期的那样,这是一个bug! - CinCout

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接