2013-06-20 34 views
7

Tôi tình cờ gặp một tình huống khó hiểu khi tôi tìm thấy một chuyển đổi thu hẹp rõ ràng, nhưng tôi thất vọng rằng trình biên dịch (gcc-4.7.2) không tăng cảnh báo mặc dù cờ -Wall -Wnarrowing -pedantic. Xin vui lòng xem các chương trình sau đây:Không có cảnh báo nào để thu hẹp khi khởi tạo bằng dấu ngoặc đơn

struct A { 
    int m; 
    A(int m) : m(m) {}; 
}; 

int main() { 
    unsigned long v = 0; 
    A a1(v); // narrowing, but no warning (should this not cause a warning?) 
    A a2{v}; // narrowing, warning raised (expected) 
} 

khởi của a1 dường như bay mà không cần quá nhiều như một peep từ trình biên dịch. Chỉ để chắc chắn rằng tôi đã không điên, tôi đã cố gắng khởi tạo a1 theo cách tương tự, nhưng với niềng răng thay vì parens. Trình biên dịch cảnh báo về việc thu hẹp trong trường hợp thứ hai, như đã được mong đợi.

Để rõ ràng: Tôi không hỏi về tính hợp pháp của việc thu hẹp chuyển đổi trong danh sách khởi tạo. Tôi biết đó không phải là hợp pháp - việc khởi tạo xoăn của a2 chỉ là một sự kiểm tra sự tỉnh táo. Câu hỏi của tôi không liên quan đến danh sách khởi tạo. Đây không phải là một câu hỏi trùng lặp.

Trình biên dịch có nên cảnh báo tôi về việc thu hẹp để khởi tạo a1 không?

+0

Phương thức khởi tạo cho 'a1' có thể thực hiện một chuyển đổi ẩn, trong khi đối với' a2' thì không thể. Tại sao bạn nghĩ rằng họ nên giống nhau? –

+1

Điều gì sẽ xảy ra nếu bạn thêm cờ '-Wconversion'? –

+0

Đây không phải là bản sao. Tôi đã biết rằng việc thu hẹp chuyển đổi trong danh sách khởi tạo là bất hợp pháp. Tôi hỏi về initializaiton với dấu ngoặc đơn. –

Trả lời

2

Wsign-conversion sẽ tạo ra một cảnh báo cho rằng dòng mã - -Wconversion sẽ không khi unsigned longint có cùng kích thước (đó là đúng trên nhiều nền tảng, ngay cả một số nền tảng 64-bit). Đối với mã C, -Wconversion sẽ cho phép -Wsign-conversion ngầm, nhưng điều đó không xảy ra với C++ vì một số lý do.

Nếu bạn thay đổi loại v thành long long, -Wconversion tự nó sẽ tạo cảnh báo (giả sử rằng int là 32 bit).

+0

Cảm ơn bạn rất nhiều vì sự thấu hiểu của bạn. Tôi rất vui vì ngữ nghĩa của danh sách khởi tạo là rất cụ thể về chuyển đổi - đây có thể là lý do tốt để tôi bắt đầu sử dụng '{}' ở bất kỳ nơi nào tôi cần mã để di chuyển nhất để trình biên dịch có thể nắm bắt được các cạm bẫy chuyển đổi trước khi tôi thực sự nhắm mục tiêu một nền tảng mới. –

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