C++ union元素大小基于其他元素大小

pio*_*kg2 45 c++ c++11

考虑以下代码:

struct S
{
    union
    {
        int arr1[10];
        char arr2[sizeof(arr1)];
    };
};
Run Code Online (Sandbox Code Playgroud)

它在c ++ 03和c ++ 11模式下与gcc 4.9.2成功编译.但是,当我改为S像这样的模板时:

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

我得到以下错误输出:

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

Tel*_*kis 16

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

这是一个解决方法:

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

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

通过命名联合,我们阻止编译器直接包含它.然后它可以arr1正确检索.

但是,这也意味着,arr1arr2没有不S的成员了.

最后,Members can be defined in terms of other members但后者必须由编译器"找到".


amc*_*con 6

你可以这样做:

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