2017-05-24 14 views
7

Trình biên dịch clang phát ra cảnh báo cho đoạn mã dưới đây, như có thể thấy here.Tại sao clang phát ra những cảnh báo này?

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. 

Tại sao điều này?

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

int main(){ 
    point(); 
} 

Theo như tôi có thể nói, {1}{2} là đối số mặc định hoàn toàn hợp lệ theo [dcl.fct.default]/1, [dcl.fct]/3[dcl.init]/1.

+6

Vâng, đó chỉ là một cảnh báo, IMO điều này chỉ có nghĩa là "hey, đó là vô dụng và có vẻ lạ, bạn có chắc đó là ý của bạn không?". – Quentin

+0

@Quentin Vì đây dường như là một mã hoàn toàn hợp lệ, nên không có cảnh báo. –

+6

Có rất nhiều đoạn mã hợp lệ kích hoạt cảnh báo - lỗi kích hoạt mã không hợp lệ. 'if (x = something());' là một số khác. – Quentin

Trả lời

1

niềng răng thường được sử dụng khi khởi tạo các trường hợp của cấu trúc, ví dụ:

struct example { 
    int member1; 
    int member2; 
}; 

example x = { 1, 2 }; 

Clang đang nói với bạn rằng việc bạn sử dụng niềng răng không phải là "bình thường" để khởi tạo một giá trị duy nhất. Cảnh báo này có thể giúp nếu bạn không quen thuộc với cú pháp để khởi tạo các giá trị trong C++, hoặc có lẽ nếu các kiểu trước đây đã được cấu trúc trước khi tái cấu trúc một số kiểu.

Bạn có thể ngừng sử dụng niềng răng khi khởi tạo số nguyên hoặc chuyển cờ -Wno-braced-scalar-init cho trình biên dịch để dừng báo cáo cảnh báo.

Các vấn đề liên quan