2014-03-04 3 views
2

g ++ 버그입니까?상속하는 생성자가 배열과 같은 초기화를 허용하지 않습니다.

#include <array> 

struct inherit : std::array<int , 3>{ 
    using std::array<int , 3>::array; 
}; 

std::array<int, 3> ok1 = {1,2,3}; 
inherit ok2; 
inherit bad = {1,2,3}; 

bad 인스턴스화, 나는 error: could not convert ‘{1, 2, 3}’ from ‘<brace-enclosed initializer list>’ to ‘inherit’를 얻을. 그것은 나에게 절대적으로 옳은 것처럼 보입니다.

+3

'std :: array'에 암시 적으로 선언 된 생성자가있는 경우 초기화 할 클래스의 생성자를 명시 적으로 정의해야합니다. 따라서 구성은 집계 초기화를 사용합니다. 집계는 기본 클래스를 가질 수 없으므로'inherit'은 집계가 아니므로 집계 초기화를 사용할 수 없습니다. –

+1

집계 초기화에 대한 링크가 있습니다. http://en.cppreference.com/w/cpp/language/aggregate_initialization – yinqiwen

답변

3

std::array은 집합체입니다. 사용자 정의 생성자가 없습니다. C++ 표준

1 집계 가입일

에는 사용자가 제공 생성자 (12.1)없이 비 정적 개인 또는 보호 된 데이터 멤버 (절로 배열 또는 클래스 (9 절) 인 11), 기본 클래스 없음 (10 절), 가상 함수 없음 (10.3).

클래스 상속은 기본 클래스를 가지고 있으므로 집계가 아닙니다. 따라서 중괄호 초기화를 사용하지 않을 수도 있습니다 (빈 초기화 프로그램 목록 제외).

관련 문제