2015-10-22 1 views
7

Warum kompiliert der folgende Code ohne Warnungen. Beachten Sie, dass blablabla() nicht anywheh definiert ist.Warum "std :: string (blablabla());" kompilieren ohne Fehler?

I getestet und in gcc 5.1.0clang-3.7.0 (mit und ohne die -std = C++ 11 flag).

#include <string> 

int main() 
{ 
    std::string(blablabla()); 
} 

Diese Frage ist nicht ein Duplikat der drängendsten Parst Mehrdeutigkeit, da verwandte Beispiele Funktionen mit einem Parameter deklarieren.

+0

Wenn ich eine Rate wetten sollte, ist die Aussage optimiert, weil Sie es einfach in keiner Weise verwenden. Sie weisen die Zeichenfolge keiner Variablen zu und übergeben sie auch nicht an eine Funktion. Als solcher kann der Compiler es "übersehen". Aber das ist eine Vermutung. –

+3

Warnungen sollten in jedem neueren Compiler unabhängig von * jeder * Optimierung sein. – Kamajii

+0

Err, wenn 'blablabla()' eine Funktion wäre, die '' cout << "Hallo \ n"; ', wie würde diese Optimierung dann funktionieren? Ich bin mir ziemlich sicher, dass Sie Code nicht so optimieren dürfen, dass er das Verhalten grundlegend ändert. In jedem Fall ist es nicht * ruft * 'blablabla' auf, es gibt keinen Unterschied zwischen dieser Aussage und einer, bei der die äußeren Klammern entfernt wurden. – paxdiablo

Antwort

8

Ahhhh Ich bin dumm.

Es wird nicht als Anruf behandelt. Der Compiler sieht es nur als eine Erklärung ...

Versuchen zum Vergleich:

int main() { 
    int(blablabla); 
} 

Das gibt:

test.c++: In function ‘int main()’: 
test.c++:6:9: warning: unused variable ‘blablabla’ [-Wunused-variable] 
    int(blablabla); 
     ^

Genauer gesagt, Ihre Aussage std::string(blablabla())blablabla erklärt eine Funktion seine Rückkehr ein std::string, das gleiche wie

std::string blablabla(); 

würde tun. Eine lokale Funktionsdeklaration.

+0

ist int (blablabla); das gleiche wie die Deklaration int blablabla; ? –

+3

Ramana: Ja, Sie haben nur die Kennung geklammert. Fügen Sie ein Leerzeichen ein und es wird klarer: 'int ((((blablabla))));'.Übrigens gibt es auch Fälle, in denen die Klammern sogar notwendig sind, nämlich beim Deklarieren von Function-Zeigern (um den Stern an den Bezeichner und nicht an den Rückgabetyp anzuhängen). – Kamajii

+0

@Ramana Ja, der Hinweis ist, dass es warnt, dass die Variable 'blablabla' nicht verwendet wird. – skyking