Ich habe diese Funktion:
%Vor%In dieser Funktion gebe ich NULL und den Code kompilieren (IDE: VS 2012). Für mich, NULL ist es kein std :: string-Objekt, so dass wir das nicht schreiben können.
Also warum ist es richtig, NULL zurückzugeben, wenn die Rückgabe der Funktion ein std :: string ist?
Der Wert NULL
ist äquivalent zu 0
in C ++ und 0
ist eine absolut gültige char const*
Konstante. Die String-Klasse hat einen explicit
-Konstruktor, der char const*
übernimmt, d. H. Der Compiler kompiliert den Code, aber es funktioniert nicht: Das heißt, obwohl der Compiler den Code ausschließt, ist das Verhalten nicht definiert.
Wenn ich die Definition in C ++ 11 betrachte, sehe ich keine delete
d Überladung, die ein std::nullptr_t
übernimmt, d. h. sie wird auch kompiliert, wenn von nullptr
konvertiert wird. Ich hätte gehofft, dass es eine delete
d Überladung geben würde, die ein std::nullptr_t
übernimmt, was es dem Compiler ermöglichen würde, die Situation zumindest zu erfassen, wenn nullptr
übergeben wird.
Sie erstellen eine std::string
von char const*
gleich 0
(oder NULL
).
Dies ist durch den Standard eigentlich verboten:
[C++11: 21.4.2/9]
Erfordert:s
darf kein Nullzeiger sein
Allerdings ist GCC für Sie besonders nett und tut es überprüft, um es zu einem No-Op zu machen . Es ist nicht erforderlich, und Sie sollten sich niemals darauf verlassen.