2017-05-24 14 views
7

Kompilator clang emituje ostrzeżenia dotyczące poniższego fragmentu, co można zobaczyć pod here.Dlaczego klang emituje te ostrzeżenia?

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. 

Dlaczego tak jest?

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

int main(){ 
    point(); 
} 

O ile mogę powiedzieć, {1} i {2} są doskonale ważne argumenty domyślne według [dcl.fct.default]/1, [dcl.fct]/3 i [dcl.init]/1.

+6

Cóż, to tylko ostrzeżenie, IMO to po prostu oznacza "hej, to bezużyteczne i wygląda dziwnie, czy jesteś pewien, że o to ci chodziło?". – Quentin

+0

@Quentin Ponieważ wydaje się, że jest to całkowicie poprawny kod, nie powinno być żadnego ostrzeżenia. –

+6

Istnieje wiele ważnych fragmentów, które wywołują ostrzeżenia - nieprawidłowy kod wyzwala błędy. 'if (x = something());' jest kolejnym. – Quentin

Odpowiedz

1

Szelki są zazwyczaj używane przy inicjalizacji wystąpień kodowanym, na przykład:

struct example { 
    int member1; 
    int member2; 
}; 

example x = { 1, 2 }; 

Clang mówi ci, że korzystanie z szelek nie jest „normalne” dla inicjowania pojedynczą wartość. To ostrzeżenie może pomóc, jeśli nie jesteś zaznajomiony ze składnią dotyczącą inicjowania wartości w C++, lub może, jeśli typy były wcześniej strukturowane przed jakimś refaktoryzacją.

Można zatrzymać używanie klamr podczas inicjowania liczb całkowitych lub przekazać do kompilatora flagę -Wno-braced-scalar-init, aby zatrzymać zgłaszanie ostrzeżenia.

Powiązane problemy