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

|
void foo (int x)
{
  struct A { static const int d = 0; }; // error
}
除了标准的参考文献之外,这背后是否有任何动机禁止内部类内部的“ 1”场?
error: field `foo(int)::A::d\' in local class cannot be static
编辑:但是,允许使用“ 1”个成员函数。对于这种情况,我有一个用例。假设我只想为POD调用
foo()
,那么我可以像这样实现它,
template<typename T>
void foo (T x)
{
  struct A { static const T d = 0; }; // many compilers allow double, float etc.
}
foo()
应该仅用于POD(如果允许
static
),而不能传递给其他数据类型。这只是我想到的一个用例。     
已邀请:
我猜这是因为静态类成员必须在全局范围内定义。 编辑: 抱歉,成为一个懒散的人,只是丢掉东西:)更精确一点。一个类的静态成员需要在全局范围内定义,例如 foo.h
class A {
  static int dude;
};
foo.cpp
int A::dude = 314;
现在,由于void foo(int x)内的作用域不是全局的,因此没有定义静态成员的作用域。希望这一点更加清楚。     
Magnus Skog给出了真正的答案:静态数据成员只是一个声明;该对象必须在名称空间范围内的其他位置定义,并且类定义在名称空间范围内不可见。 请注意,此限制仅适用于静态数据成员。这意味着有一个简单的解决方法:
class Local
{
    static int& static_i()
    {
        static int value;
        return value;
    }
};
这为您提供了完全相同的功能,但代价是 使用函数语法来访问它。     
因为没有人看到它的需要? [edit]:静态变量只需要定义一次,通常在类之外(内建函数除外)定义。将它们包含在本地类中将需要设计一种定义它们的方法。 [/编辑] 添加到语言的任何功能都需要付费: 它必须由编译器实现 它必须在编译器中维护(并且甚至可能引入其他功能的错误) 它存在于编译器中(因此即使不使用它也可能导致速度变慢) 有时,不实施功能是正确的决定。 局部函数和类已经给语言增加了难度,但收效甚微:使用ѭ1函数和未命名的名称空间可以避免它们。 坦白说,如果我必须做出决定,我将把它们全部删除:它们只会使语法混乱。 一个例子:最令人头疼的解析。     
我认为这是相同的命名问题,已使我们无法在模板实例化中使用局部类型。 名称
foo()::A::d
对于链接器来说不是一个好名字,因此如何找到静态成员的定义?如果函数baz()中还有另一个struct A,该怎么办?     
有趣的问题,但是我很难理解为什么要在本地课程中使用静态成员。静态通常用于维护程序流中的状态,但是在这种情况下,使用范围为4的静态变量不是更好吗? 如果我不得不猜测为什么存在该限制,我会说这与编译器知道何时执行静态初始化的困难有关。 C ++标准文档可能会提供更正式的理由。     

要回复问题请先登录注册