2017-05-24 15 views
7

here에서 볼 수 있듯이 clang 컴파일러는 아래 스 니펫에 대한 경고를 내 보냅니다.clang이 왜 이러한 경고를 내 보냅니 까?

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. 

왜 그렇습니까? 내가 말할 수있는

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

int main(){ 
    point(); 
} 

는 지금까지, {1}{2}[dcl.fct.default]/1, [dcl.fct]/3[dcl.init]/1에 따라 완벽하게 유효한 기본 인수입니다.

struct example { 
    int member1; 
    int member2; 
}; 

example x = { 1, 2 }; 

연타가 괄호의 사용은 하나의 값을 초기화하기위한 "정상"아니라고 말하고있다 : 예를 들어, 구조체의 인스턴스를 초기화 할 때

+6

글쎄, 그건 단지 경고 야, IMO는 단지 "헤이, 쓸데없고 이상해 보여. 그게 니가 의미하는 바가 틀림 없니?"라고 의미합니다. – Quentin

+0

@Quentin이 코드가 완벽하게 유효한 코드 인 것으로 보이므로 경고가 표시되지 않습니다. –

+6

경고를 트리거하는 많은 유효한 스 니펫이 있습니다. 잘못된 코드가 오류를 유발합니다. 'if (x = something());는 또 하나입니다. – Quentin

답변

1

교정기는 일반적으로 사용된다. 이 경고는 C++에서 값을 초기화하는 구문에 익숙하지 않거나 형식이 이전에 어떤 종류의 리팩터링 전에 구조화 된 경우에 도움이 될 수 있습니다.

정수를 초기화 할 때 중괄호 사용을 중지하거나 컴파일러에 -Wno-braced-scalar-init 플래그를 전달하여 경고를보고하지 않도록 할 수 있습니다.