考虑这段代码:
class Foo {
private:
static char buffer[];
};
char Foo::buffer[100];
这是有效的,还是我需要
buffer[100]
也在类定义中?
在类中声明的非内联静态数据成员可能具有不完整的类型。
来自 C++ 17 标准(12.2.3.2 静态数据成员)
2 非内联静态数据成员在其类中的声明 definition 不是定义,可能是不完整的类型 other 比 cv void. 静态数据成员的定义不是 类定义中的内联定义应出现在命名空间中 包含成员类定义的范围。在定义中 命名空间作用域,静态数据成员的名字应该被限定 使用 :: 运算符按其类名。中的初始化表达式 静态数据成员的定义在其类的范围内 (6.3.7).
所以类定义中的这个声明(有错别字:类型指定
char
出现了两次)
static char char buffer[];
不是(内联数据成员的)定义,它可能具有不完整的字符数组类型。
另一方面,如果您想在类定义中引用数组,最好将其声明为完整类型。例如这个类定义
class Foo
{
public:
void f() const
{
std::cout << std::size( buffer ) << '\n';
}
private:
static char buffer[];
};
不会编译,因为在此表达式
f
中的函数std::size( buffer )
中使用了不完整的数组类型。
这个有效吗
是的,这是有效的因为对于
buffer
你有一个declaration不是类内的定义。这个可以从static member's documentation看到:
类体内的声明不是定义,可以将成员声明为不完整类型(void除外),包括声明成员的类型。
这意味着
buffer
在类内的 declaration中可以有不完整的类型,例如
char[]
。
显然,不。你不能那样做。