titre Taille de l'union C++ basée sur la taille de l'autre élément




taille meta title (2)

Tu peux le faire:

template <size_t N>
class S
{
private:
    union
    {
        int arr1[N];
        char arr2[N*sizeof(int)];
    };
};

Considérons le morceau de code suivant:

struct S
{
    union
    {
        int arr1[10];
        char arr2[sizeof(arr1)];
    };
};

Il compile avec succès avec gcc 4.9.2 en mode c ++ 03 et c ++ 11. Cependant, lorsque je modifie S pour qu’il soit un modèle comme ceci:

template <size_t N>
struct S
{
    union
    {   
        int arr1[N];
        char arr2[sizeof(arr1)];
    };  
};

Je reçois le message d'erreur suivant:

error: int S<10ul>::<anonymous union>::arr1 [10]' is inaccessible

int arr1[N];

error: within this context

char arr2[sizeof(arr1)];

Clang compile les deux versions uniquement en mode c ++ 11. Je suis curieux de savoir quel est le comportement correct ici. Peut-être devrais-je déclarer explicitement que la taille d' arr2 est sizeof(int) * N ?


Votre syndicat est anonyme. Ainsi, le compilateur créera arr1 et arr2 au niveau de la classe.
Pour cette raison, char arr2[sizeof(arr1)]; ne fera pas référence à arr1 correctement.

Voici une solution de contournement:

template <size_t N>
struct S
{
    union A
    {   
        int arr1[N];
        char arr2[sizeof(arr1)];
    };  
};

Compile bien ici: https://ideone.com/JcvOYg

En nommant l'union, nous empêchons le compilateur de l'inclure directement. Il est alors capable de récupérer arr1 correctement.

Mais cela signifie également que arr1 et arr2 ne sont plus des membres de S

Enfin, les Members can be defined in terms of other members mais ce dernier doit être "détectable" par le compilateur.







c++11