基于其他元素大小的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
?
你的工会是匿名的。 因此,编译器将在类级创buildarr1
和arr2
。
因此, 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
。
但这也意味着arr1
和arr2
不再是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)]; }; };