c++ function language-lawyer stdstring

c++ - ¿Por qué no es un error en tiempo de compilación devolver un nullptr como std:: string?



function language-lawyer (2)

¿Por qué no debería compilarse? std::string tiene el siguiente constructor:

string(const CharT* s, const Allocator& alloc = Allocator());

que construye la cadena con el contenido inicializado con una copia de la cadena de caracteres terminada en nulo apuntada por s . El constructor no es explícito, por lo que la conversión implícita de nullptr a std::string es de hecho posible.

Debido a un error, acabo de descubrir que este código se compila bien con Visual Studio 17 y probablemente también en otros compiladores. Ahora tengo curiosidad por qué?

#include <iostream> #include <string> std::string foo(){ return nullptr; } int main(){ auto s = foo(); std::cout << s << std::endl; }

Podría imaginar que se debe a que el std::basic_string podría invocarse con un char* y, al mismo tiempo, devuelve una conversión implícita de ptr a std::string (con NULL como argumento y luego desaparece). ¿Estoy en el camino correcto?


Sí, su suposición es correcta, al verificar std::basic_string constructores # 5 se llamará:

basic_string( const CharT* s, const Allocator& alloc = Allocator() );

Tenga en cuenta que pasar nullptr invoca un comportamiento indefinido como se indica en el estándar y las notas:

El comportamiento no está definido si [s, s + Traits::length(s)) no es un rango válido ( por ejemplo, si s es un puntero nulo ).