Due to a bug, I just found out that this code compiles fine on with Visual Studio 17 and probably on other compilers as well. Now I'm curious why?
#include <iostream> #include <string> std::string foo(){ return nullptr; } int main(){ auto s = foo(); std::cout << s << std::endl; } I could imagine it is because the std::basic_string c'tor could be invoked with a char* and while returning an implicit conversion from ptr to std::string occurs (with NULL as argument and then goes poof). Am I on the right way?
Yes, your assumption is right, checking std::basic_string constructors #5 will be called:
basic_string( const CharT* s, const Allocator& alloc = Allocator() ); Note that passing nullptr invokes undefined behavior as stated in the standard and the notes :
The behavior is undefined if
[s, s + Traits::length(s))is not a valid range (for example, ifsis a null pointer).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With