声明一个没有长度的静态数组并用长度定义它是否有效?

问题描述 投票:0回答:3

考虑这段代码:

class Foo {
   private:
      static char buffer[];
};

char Foo::buffer[100];

这是有效的,还是我需要

buffer[100]
也在类定义中?

c++ class static declaration member
3个回答
2
投票

在类中声明的非内联静态数据成员可能具有不完整的类型。

来自 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 )
中使用了不完整的数组类型。


0
投票

这个有效吗

是的,这是有效的因为对于

buffer
你有一个declaration不是类内的定义。这个可以从static member's documentation看到:

类体内的声明不是定义,可以将成员声明为不完整类型(void除外),包括声明成员的类型。

这意味着

buffer
在类内的
declaration
中可以有不完整的类型,例如 char[]


-3
投票

显然,不。你不能那样做。

© www.soinside.com 2019 - 2024. All rights reserved.