为什么本地类中的字段不能是静态的?

iam*_*ind 13 c++ static-members local-class

void foo (int x)
{
  struct A { static const int d = 0; }; // error
}
Run Code Online (Sandbox Code Playgroud)

除了标准的参考,这背后是否有任何动机禁止static内部阶级的领域?

error: field `foo(int)::A::d' in local class cannot be static
Run Code Online (Sandbox Code Playgroud)

编辑:但是,static允许成员函数.对于这种情况,我有一个用例.假设我只想foo()为POD调用,那么我可以实现它,就像

template<typename T>
void foo (T x)
{
  struct A { static const T d = 0; }; // many compilers allow double, float etc.
}
Run Code Online (Sandbox Code Playgroud)

foo()应该只传递POD(如果static允许)而不传递给其他数据类型.这只是我脑海中的一个用例.

ral*_*nja 5

我猜这是因为必须在全局范围内定义静态类成员。

编辑:

对不起,我是个懒鬼,只是把东西扔了:) 更准确一点。类的静态成员需要在全局范围内定义,例如

foo.h

class A {
  static int dude;
};
Run Code Online (Sandbox Code Playgroud)

文件

int A::dude = 314;
Run Code Online (Sandbox Code Playgroud)

现在,由于 void foo(int x) 内的作用域不是全局的,因此没有定义静态成员的作用域。希望这更清楚一点。


Jam*_*nze 5

Magnus Skog给出了真正的答案:静态数据成员只是一个声明; 该对象必须在命名空间范围内的其他地方定义,并且类定义在命名空间范围内不可见.

请注意,此限制仅适用于静态数据成员.这意味着有一个简单的解决方法:

class Local
{
    static int& static_i()
    {
        static int value;
        return value;
    }
};
Run Code Online (Sandbox Code Playgroud)

这为您提供了完全相同的功能,但代价是使用函数语法来访问它.