문제

관련된: 초기화하는 방법을 비 POD 회원에 Union

표준 말

에서 가장 중 하나는 정적이 아닌 데이터 구성원의 조합할 수 있는 보조 또는 동등 이니셜라이저입니다.

struct Point {
    Point() {}
    Point(int x, int y): x_(x), y_(y) {}
    int x_, y_;
};

union U {
    int z;
    double w;
    Point p = Point(1,2);
};


#include <iostream>
int main () {
    U u;
    std::cout << u.p.x_ << ":" << u.p.y_ << std::endl;
}

인쇄 4196960:0 대상 1:2.

저는 이것을 고려한 컴파일러는 버그입니다.그렇습니까?

도움이 되었습니까?

해결책

C++11[클래스입니다.ctor]/5 개의 국가:

A 기본 생성자를 위해 클래스 X 가 생성자의 클래스 X 호출할 수 있는 없습니다.없는 경우에는 사용자 생성자를 위해 클래스 X, 생성자를 데 없는 매개변수를 암시적으로 선언했으로 기본값(8.4).암시적으로 선언된 기본 생성자입니다 inline public 의 구성원입니다.는 기본 설정의 기본 생성자를 위해 클래스 X 으로 정의 삭제된 경우:

  • X 은 연합 같은 클래스가 있는 변형과 구성원이 아닌 사소한의 기본 생성자
  • 모든 정적이 아닌 데이터 구성원이 없 중괄호 또는 동등 이니셜라이저 은 참조의 유형
  • 비 변형 정적이 아닌 데이터 구성원의 const 자격을 갖춘 입력(또는 그 배열)없음 중괄호 또는 동등 이니셜라이저 하지 않는 사용자가 제공하는 기본값 생성자
  • X 은 연합 및 그것의 모든 변형 멤버들의 const 자격을 갖춘 입력(또는 배열의 관계)
  • X 비 union 클래스고의 모든 구성원은 익명 연합 회원의 const 자격을 갖춘 입력(또는 배열의 관계)
  • 어떤 직접적인 또는 가상의 기본 클래스 또는 정적이 아닌 데이터 구성원이 없 중괄호 또는 동등 이니셜라이저, 고 있는 클래스 형식 M (또는 그 배열)및 중 M 는 기본값은 없 생성자 또는 하중 초과해상도(13.3)를 적용 M로 생성자의 결과에서는 모호성이나 기능하는 삭제 또는 액세스 할 수없는에서 기본값이 기본 생성자,또는
  • 어떤 직접적인 또는 가상의 기본 클래스 또는 정적이 아닌 데이터 구성원은 형식으로 소멸자는 삭제 또는 액세스 할 수없는에서 기본값이 기본 생성자입니다.

기본값 생성자를 사소한되지 않는 경우 사용자가 제공하는 경우:

  • 해당 클래스에는 가상의 기능(10.3)고 어떤 가상 기본 클래스(10.1),고
  • non-static 데이터 구성원의 클래스 중괄호 또는 동등 이니셜라이저, 고
  • 모든 직접적인 기본 클래스를 해당 클래스의가 있는 사소한의 기본 생성자 및
  • 모든 정적이 아닌 데이터 구성원의 클래스가 있는 클래스 종류(또는 편물),이러한 각 클래스에는 사소한의 기본 생성자입니다.

그렇지 않으면 기본값 생성자 non-trivial.

이후 구조 Point 에서 OP 가 아닌 사소한의 기본 생성자

Point() {}

는 기본 설정에 대한 기본 생성자조합의 구성원을 포함하는 종류 Point 으로 정의될 삭제에 따르면 첫 번째 bullet:

  • X 은 연합 같은 클래스가 있는 변형과 구성원이 아닌 사소한의 기본 생성자

결과에서 프로그램에서 제시하는 OP 는 병이 형성된다.

그러나,위원회는 것 같이 될 것을 고려 하는 결함이 있는 경우 회원의 동맹가 중괄호 또는 동등 이니셜라이저, 당 코어 작업 그룹 문제 1623:

에 따라 12.1[클래스입니다.ctor]제 5 항,

는 기본 설정에 대한 기본 생성자 등 X 으로 정의 삭제된 경우:

  • X 은 연합 같은 클래스가 있는 변형과 구성원이 아닌 사소한의 기본 생성자

  • ...

  • X 은 연합 및 그것의 모든 변형 멤버들의 const 자격을 갖춘 입력(또는 배열의 관계)

  • X 비 union 클래스고의 모든 구성원은 익명 연합 회원의 const 자격을 갖춘 입력(또는 배열의 관계)

  • ...

기 때문에 이 존재의 정적이 아닌 데이터가 회원 이니셜라이저 도덕적 해당하는 mem-initializer, 이러한 규칙은 아마도 수정하지 않을 정의 생성된 생성자를 삭제할 때 조합원은 정적이 아닌 데이터가 회원 이니셜라이저입니다.(참고 참조 규범에서 9.5[클래스입니다.유니온]단락 2-3 및 7.1.6.1[dcl.유형입니다.이력서]제 2 항는 것 또한 업데이트해야 하는 경우 이러한 제한이 변경되었습니다.)

그것은 또한 도움이 될 것을 추가하는 요구 사항을 9.5[클래스입니다.유니온]필요로 하는 정적이 아닌 데이터가 회원 이니셜라이저 또는 사용자 생성자를 제공하는 경우 모든 멤버들의 조합이 const 자격 형식입니다.

에 보다 일반적인 참고,왜 기본 생성자 정의로 삭제 하기 때문에 구성원이 아닌 사소한의 기본 생성자?Union 자체를 알 수 없는 회원이 활동 중 하나,기본 건설 않을 초기 구성원이(가정 없음 중괄호 또는 동등 이니셜라이저).그것은"소유자"의 동맹의 수명을 제어하는 활동 회원(는 경우),사용자가 제공-생성자를 강제하는 디자인 패턴을 이해되지 않는다.따라 동일한 라인,그 이유는 기본 소멸자 정의로 삭제 하기 때문에 회원은 소멸자가?나는 것에 동의하는 이 제한하는 경우 그것은 경우에만 적용됩 union 또한 사용자 제공-생성자입니다.

문제 1623 있는 상태의"제"나타내는 위원회를 믿고 문제입니다 아마도 결함이 없이 왜 다른 사람을 허용 중괄호 또는 동등 이니셜라이저 에 대한 동맹의 회원이십니까?-그러나지 않은 헌신을 확인하는 시간을 적절한 표현에 대한 해상도입니다.실제로,단락은 주로 동일 현재 C++14 초안 N3936([클래스입니다.ctor]/4)제외하고는 표현은"어떤 직접적인 또는 가상의 기본 클래스 또는 정적이 아닌 데이터 구성원은"어디에나 대체에 의해 간단한"모든 잠재적으로 건설 하위 개체."

지만 동작을 모두 컴파일러가지 엄격하게 준수해 이야에서 행동의 정신을 표준입니다.그것은 나타나는 GCC 가 혼동의 조합에 의해 삭제된 기본 생성자 중괄호 또는 동등 이니셜라이저:

GCC 가 아마 하나 표준을 준수하고 진단하는 프로그램으로 병이 형성되고,에뮬레이트나 그 소리의 행동과 생성에 적절한에서 생성자 중괄호 또는 동등 이니셜라이저.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top