2017-12-10 1 views
6

-Wall-Wextra을 사용하는 GCC로 일부 코드를 컴파일했습니다. Wmissing-field-initializers와 C++ 17의 집계 초기화에 대해 걱정해야합니까?

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

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

struct C : A, B {}; 

int main() { 
    (void) C{1}; 
} 
내가 그것에 대해 걱정해야 :이 코드는 경고를 생산? GCC에서이 경고를 출력하는 버그입니까? 초기화 할 필드가없고 누락 된 매개 변수가없는 것 같습니다.

답변

7

C++ 17을 사용하면 기본 클래스가있는 클래스에서 집계 초기화를 수행 할 수 있습니다. 각 기본 클래스는 효과적으로 멤버로 간주됩니다 (클래스의 직접 멤버보다 먼저옵니다). 따라서 초기화를 집계하려면 C에는 C::AC::B의 두 개의 '멤버'가 있습니다.

하나만 초기화했습니다.

물론, B에는 초기화 할 것이 없습니다. 그러나 -Wall에,이 다르지 없습니다 :이 너무 경고를 줄 것이다

struct C 
{ 
    A a; 
    B b; 
}; 

(void) C{1}; 

. 두 경우 모두 B : (void)C{1, {}};에 대한 명시적인 이니셜 라이저를 제공하여 음소거합니다.

그러나 표준에 관한 한, 이것은 완벽하게 유효한 코드입니다. B은 값이 초기화됩니다. 어느 쪽이든.

+0

오 물론 ... 여기에 제네릭 코드를 다루므로 빈 매개 변수를 추가하기가 어려울 수 있습니다. ( –

+0

@GuillaumeRacicot 이니셜 라이저의 예상 개수를 알 수 있습니까? SFINAE. –

관련 문제