2017-05-02 8 views
8

현재 풀 할당자를 프로그래밍 중입니다. 내 질문은 다음 코드로 요약됩니다.C++ 17 표준은 공용체의 주소가 해당 구성원의 주소와 동일하다는 것을 보장합니까?

template <typename T> 
union myUnion { 
    T data; 
    myUnion<T>* nextUnion; 
}; 

void someFunction(){ 
    myUnion<T> mu; 
    T* t = new (std::addressof(mu.data)) T(); 
    //some code 
    myUnion<T>* mu2 = reinterpret_cast<myUnion<T>*>(t); 
} 

mu 주소는 mu2와 동일합니까?

+0

어느 표준입니까? –

+0

그렇지 않으면 노동 조합의 핵심은 무엇입니까? –

+3

@MadPhysicist : 그것에 대해 거의 모든 것. –

답변

18

예.

9.2/19 (N4659 12.2/24)

표준 레이아웃 클래스 객체가 아닌 정적 데이터 멤버가있는 경우, 그 어드레스는 그 제 비의 주소와 동일 정적 데이터 멤버.

노동 조합 자체가 표준 레이아웃 인 경우 노동 조합의 주소는 해당 구성원의 주소와 동일합니다. 멤버

주소는 덕분 모두 동일한 9.5/1 (N4659 12.3/2)는 (A)의 소울 부재 것처럼

각 비 정적 데이터 멤버는 분배 구조체. 공용체 객체의 모든 비 정적 데이터 멤버는 동일한 주소를가집니다.

+0

C++ 11/C++ 14의 §9.2/20이 아닌가요? – Cameron

+0

@Cameron : C++에는 9.2/20이 없습니다. 14. –

+1

9.2/19 초안에 있습니다. 실제 표준이 없으면 너무 비싸요. – Fanael