2016-04-24 9 views
3

Ich verstehe nicht, warum ich (mit g ++ oder Klirren ++) keine Warnung erhalten für eine NULL als ein Objekt in newtstr() unten Rückkehr:keine Warnung erhalten, wenn NULL als Objekt der Rückkehr

#include<iostream> 
using namespace std; 

string newstr(); 

int main() 
{ 
     string s = newstr(); 
     cout << s << endl; 
     return 0; 
} 

string newstr() 
{ 
     return NULL; 
} 

.

$ g++ -Wall -Wextra -pedantic testptr.cpp 
$ 

ich jedoch erhalten einen Laufzeitfehler:

$ ./a.out 
terminate called after throwing an instance of 'std::logic_error' 
    what(): basic_string::_S_construct null not valid 
Aborted 
$ 

.

$ g++ --version 
g++ (GCC) 4.8.0 
+0

Sie haben diesen Schlag ++ getaggt. Gilt das auch für den Klang? –

+1

Warum erwarten Sie eine Warnung? Es ist ein gültiges Konstrukt. – ZDF

+0

@ZDF OP ist sich entweder der impliziten 'const char *' Cast nicht bewusst, oder er würde erwarten, dass sein Compiler "hey, das ist ein statischer Ausdruck, der mir einen Nullzeiger gibt, mit dem der' string' ctor versucht, Sachen zu tun sollte es mich davor warnen! ". –

Antwort

7

std::string eine constructorbasic_string(const CharT* s, const Allocator& alloc = Allocator()); hat, die eine neue Zeichenfolge für die Konstruktion eines const char* Zeiger übernimmt (siehe (5)). Die Zeile return NULL; führt zu einem impliziten Aufruf dieses Konstruktors mit einem NULL-Zeiger als Argument - das ist ein gültiger Code, der aber offensichtlich nicht korrekt ausgeführt wird.

+0

Ah - danke! Ich denke, das fällt in die Kategorie "Es gibt eine Menge in die C++ - Standardbibliothek" –

+0

nicht wirklich, @ChrisGregg. Stellen Sie sich eine Welt vor, in der es keine Methode gibt, einen'std :: string 'aus einer C-Stil-Zeichenkette zu konstruieren (was ein'const char'-Array ist, das für alle Methodenaufrufe in ein'const char *' umgewandelt wird) Es ist kläglich schwierig, Zeichenfolgen in Ihrem Code zu spezifizieren, weil Ihr normales "Text" - Zeichenfolgenliteral genau das ist - eine Zeichenfolge im C-Stil. –