I goggled it & tried to find similar question on SO also but didn\'t find anything useful. So, posting my question here.
Consider this program:
#
What happens is that an std::string
is implicitly constructed from false
, using the const CharT*
overload and converting false
to a null pointer. According to the documentation for that constructor :
The behavior is undefined if
s
[the pointer] does not point at an array of at leastTraits::length(s)+1
elements ofCharT
.
Hence the malfunctioning (in the form of a friendly exception, but don't rely on it).
Now, is it correct ? According to [conv.ptr] :
A null pointer constant is an integer literal (2.13.2) with value zero or a prvalue of type
std::nullptr_t
.
false
has indeed a value of zero, but is not an integer literal (it's a boolean literal). The implicit conversion to the CharT*
that std::string
's constructor takes is thus non-standard.
And indeed, while GCC emits a warning, Clang refuses to compile it.