c++ - Warum ist es kein Fehler bei der Kompilierung, ein nullptr als std:: string zurückzugeben?




function language-lawyer (2)

Ja, Ihre Annahme ist richtig. std::basic_string Konstruktoren # 5 überprüfen, wird std::basic_string aufgerufen:

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

Beachten Sie, dass das Übergeben von nullptr undefiniertes Verhalten wie im Standard und in den Hinweisen angegeben nullptr :

Das Verhalten ist undefiniert, wenn [s, s + Traits::length(s)) kein gültiger Bereich ist ( z. B. wenn s ein Nullzeiger ist ).

Aufgrund eines Fehlers habe ich gerade herausgefunden, dass dieser Code gut mit Visual Studio 17 und wahrscheinlich auch mit anderen Compilern kompatibel ist. Jetzt bin ich gespannt warum?

#include <iostream>
#include <string>

std::string foo(){
    return nullptr;
}

int main(){
    auto s = foo();
    std::cout << s << std::endl;
}

Ich könnte mir vorstellen, dass dies daran liegt, dass der std::basic_string mit einem char* aufgerufen werden kann und dabei eine implizite Konvertierung von ptr in std::string erfolgt (mit NULL als Argument und anschließend poof). Bin ich auf dem richtigen Weg?


Warum sollte es nicht kompiliert werden? std::string hat den folgenden Konstruktor:

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

das erstellt die Zeichenfolge mit dem Inhalt, der mit einer Kopie der nullterminierten Zeichenfolge initialisiert wird, auf die von s verwiesen wird. Der Konstruktor ist nicht explizit, daher ist die implizite Konvertierung von nullptr in std::string in der Tat möglich.





stdstring