在静态成员数组定义中对自身使用sizeof操作符

Using of sizeof operator on itself in static member array definition

本文关键字:sizeof 操作符 静态成员 数组 定义      更新时间:2023-10-16

为什么我得到这个:

error: invalid application of 'sizeof' to incomplete type 'A'

当我尝试这样做时:

class A
{
  int m_i;
  static char m_j[sizeof(A)];
};

我假设在这种情况下,sizeof(A)显然是sizeof(int)。但我的编译器似乎不这么认为。

如错误信息所示,sizeof只能操作完整类型。在调用它时,A还没有完成。

c++编译器从上到下分析你的代码。在调用sizeof时,类还没有完全定义,因此,大小还不能确定。例如,如果在该行下面有另一个成员声明:

class A
{
  int m_i;
  static char m_j[sizeof(A)]; // Uh oh, m_i2 is not known here, yet
  int m_i2;
};

由于这样的问题,只能在类完全定义之后,即在它的右花括号之后使用sizeof

如果你使用模板,这是可能的:

template <class = void>
struct A {
    int i;
    static auto& m_j() {
        static char arr[sizeof(A)];
        return arr;
    }
};
int main()
{
    auto array = A<>::m_j();
}

编译器等待直到使用m_j实例化函数,此时A已经完全声明。