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, sis
es un puntero nulo ).