2017-12-10 104 views
6

Tôi đã biên soạn một số mã với GCC với kích hoạt -Wall-Wextra. Mã này tạo ra một cảnh báo:Tôi có nên lo lắng về Wmissing-field-initializers và tổng hợp khởi tạo trong C++ 17?

struct A { A(int) {} }; 
struct B {}; 

struct C : A, B {}; 

int main() { 
    (void) C{1}; 
} 
main.cpp: In function 'int main()': 
main.cpp:11:15: warning: missing initializer for member 'C::<anonymous>' [-Wmissing-field-initializers] 
    (void) C{1}; 
      ^

Tôi có nên lo lắng về điều đó? Đây có phải là lỗi trong GCC để xuất cảnh báo này không? Có vẻ như tôi không có trường để khởi tạo và không có tham số bị thiếu.

Trả lời

7

C++ 17 cho phép bạn thực hiện khởi tạo tổng hợp trên các lớp với các lớp cơ sở. Mỗi lớp cơ sở được coi là một thành viên (họ đến trước các thành viên trực tiếp của lớp). Vì vậy, để tổng hợp khởi tạo, C có hai "thành viên": C::AC::B.

Bạn chỉ khởi tạo một tài khoản.

Ồ chắc chắn, B không thực sự có bất kỳ thứ gì để khởi tạo. Nhưng đến -Wall, không khác gì điều này:

struct C 
{ 
    A a; 
    B b; 
}; 

(void) C{1}; 

Điều này cũng sẽ cảnh báo. Bạn sẽ tắt tiếng trong cả hai trường hợp bằng cách cung cấp trình khởi tạo rõ ràng cho B: (void)C{1, {}};.

Nhưng theo như tiêu chuẩn có liên quan, đây là mã hoàn toàn hợp lệ. B sẽ là giá trị được khởi tạo. Trong cả hai trường hợp.

+0

Oh well ... Tôi đang xử lý mã chung ở đó, vì vậy tôi sẽ khó thêm các thông số trống: ( –

+0

@GuillaumeRacicot Nó có thể giúp bạn biết số lượng người khởi tạo dự kiến ​​không? Những số này có thể được tính bằng cách sử dụng SFINAE. –

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