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?
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? –
Điều gì sẽ xảy ra nếu bạn thêm cờ '-Wconversion'? –
Đâ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. –