2017-05-24 4 views
7

Der clang-Compiler gibt Warnungen für das folgende Snippet aus, wie zu sehen ist here.Warum gibt der Klang diese Warnungen aus?

clang++ -std=c++14 -O0 -Wall -pedantic -pthread main.cpp && ./a.out 
main.cpp:1:18: warning: braces around scalar initializer [-Wbraced-scalar-init] 
void point(int = {1}, int = {2}) {} 
       ^~~ 
main.cpp:1:29: warning: braces around scalar initializer [-Wbraced-scalar-init] 
void point(int = {1}, int = {2}) {} 
          ^~~ 

2 warnings generated. 

Warum ist das?

void point(int = {1}, int = {2}) {} 

int main(){ 
    point(); 
} 

Soweit ich das beurteilen kann, {1} und {2} sind absolut gültige Standardargumente nach [dcl.fct.default]/1, [dcl.fct]/3 und [dcl.init]/1.

+6

Nun, es ist nur eine Warnung, IMO das bedeutet nur "Hey, das ist nutzlos und sieht komisch aus, bist du sicher, dass du das meintest?". – Quentin

+0

@Quentin Da dies scheint ein perfekt gültiger Code zu sein, sollte es keine Warnung geben. –

+6

Es gibt viele gültige Snippets, die Warnungen auslösen - ungültiger Code löst Fehler aus. 'if (x = etwas());' ist ein anderes. – Quentin

Antwort

1

Zahnspangen werden normalerweise verwendet, wenn Instanzen von Strukturen, zum Beispiel Initialisierung:

struct example { 
    int member1; 
    int member2; 
}; 

example x = { 1, 2 }; 

Clang sagen Ihnen, dass Ihre Verwendung von Klammern ist nicht „normal“ für die Initialisierung eines einzelnen Wertes. Diese Warnung könnte hilfreich sein, wenn Sie nicht mit der Syntax zum Initialisieren von Werten in C++ vertraut sind oder ob die Typen zuvor Strukturen vor einem Refactoring irgendeiner Art waren.

Sie können die Verwendung von geschweiften Klammern entweder beenden, wenn Sie Ganzzahlen initialisieren, oder das Flag -Wno-braced-scalar-init an den Compiler übergeben, damit die Warnung nicht mehr gemeldet wird.

Verwandte Themen