基于其他元素大小的C ++联合元素大小

考虑下面的一段代码:

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

它在c ++ 03和c ++ 11模式下用gcc 4.9.2编译成功。 但是,当我改变S是一个模板,如下所示:

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

我得到以下错误输出:

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

int arr1[N];

error: within this context

char arr2[sizeof(arr1)];

Clang仅在c ++ 11模式下编译这两个版本。 我很好奇这里的正确行为是什么。 也许我应该明确指出, arr2大小是sizeof(int) * N

你的工会是匿名的。 因此,编译器将在类级创buildarr1arr2
因此, char arr2[sizeof(arr1)]; 将不会正确引用arr1

这是一个解决方法:

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

在这里编译罚款: https : //ideone.com/JcvOYg

通过命名联合,我们防止编译器直接包含它。 然后它能够​​正确地检索arr1

但这也意味着arr1arr2不再是S的成员了。

最后, Members can be defined in terms of other members但后者必须由Members can be defined in terms of other members “find”。

你可以这样做:

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