std::string 用布尔值初始化
std::string initialization with a bool
考虑以下初始化:
std::string falseString = false;
std::string trueString = true;
对于 g++ 5.2.0
,编译器对 falseString
抛出警告,而对 trueString
.
抛出错误
对于 clang++ 3.6 -std=c++11
,编译器会为 falseString
和 trueString
抛出错误。
Q1) 为什么 gcc
的行为不同,即使两个初始化值的类型相同 (bool
)?
Q2) 哪个编译器是正确的,为什么?标准怎么说?
编辑:
error: no viable conversion from 'bool' to 'std::string' (aka
'basic_string')
warning: converting 'false' to pointer type for argument 1 of
'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]
首先,您绝对不能从 true
初始化 std::string
。这简直是无稽之谈。
GCC 5.2 正在接受来自 false
的初始化,但表示抗议,因为它曾经是一个有效的空指针文字。是的。比较 C++03 和 C++11 之间的 3.9.1/6 — "as described below, bool values behave as integral types" 已删除。
这几天在两个编译器上都应该出错,但是 直到大约一个月前(所以 GCC 6.0)。
考虑以下初始化:
std::string falseString = false;
std::string trueString = true;
对于 g++ 5.2.0
,编译器对 falseString
抛出警告,而对 trueString
.
对于 clang++ 3.6 -std=c++11
,编译器会为 falseString
和 trueString
抛出错误。
Q1) 为什么 gcc
的行为不同,即使两个初始化值的类型相同 (bool
)?
Q2) 哪个编译器是正确的,为什么?标准怎么说?
编辑:
error: no viable conversion from 'bool' to 'std::string' (aka 'basic_string')
warning: converting 'false' to pointer type for argument 1 of '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]
首先,您绝对不能从 true
初始化 std::string
。这简直是无稽之谈。
GCC 5.2 正在接受来自 false
的初始化,但表示抗议,因为它曾经是一个有效的空指针文字。是的。比较 C++03 和 C++11 之间的 3.9.1/6 — "as described below, bool values behave as integral types" 已删除。
这几天在两个编译器上都应该出错,但是