2017-05-02 2 views
8

Je travaille actuellement sur la programmation d'un allocateur de pool. Ma question se résume au code suivant:Est-ce que la norme C++ 17 garantit que l'adresse d'une union est la même que l'adresse de ses membres?

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); 
} 

L'adresse de mu alsways est-elle identique à mu2?

+0

Quelle norme? –

+0

Quel serait le but de l'union autrement? –

+3

@MadPhysicist: Presque tout le reste à ce sujet. –

Répondre

18

Oui.

9,2/19 (12,2/24 à N4659):

Si un objet de classe standard de mise en page a des éléments de données non-statique, son adresse est la même que l'adresse de son premier non- membre de données statiques.

Si l'union elle-même est standard, alors l'adresse de l'union est la même que celle de ses membres.

Les adresses des membres sont tous les mêmes, grâce à 9,5/1 (12,3/2 dans N4659):

Chaque élément de données non statique est attribuée comme si elle était le seul membre d'un struct. Tous les membres de données non statiques d'un objet union ont la même adresse.

+0

N'est-ce pas §9.2/20 en C++ 11/C++ 14? – Cameron

+0

@Cameron: Il n'y a pas de 9.2/20 en C++ 14. –

+1

C'est 9.2/19 dans le brouillon que j'ai. Ne pas avoir la norme actuelle, c'est trop cher. – Fanael