为什么本地类中不允许使用静态数据成员?

Pub*_*bby 24 c++ static static-members local-class

为什么static const成员不能在本地课程中存在的原因是什么?这似乎是一个相当愚蠢的限制.

例:

void foo() {
  struct bar {
    int baz() { return 0; }   // allowed
    static const int qux = 0; // not allowed?!?
  };
}

struct non_local_bar {
  int baz() { return 0; }   // allowed
  static const int qux = 0; // allowed
};
Run Code Online (Sandbox Code Playgroud)

从标准报价(9.8.4):

本地类不应具有静态数据成员.

Ger*_*ald 23

从标准9.4.2节:

如果静态数据成员是const integer或const枚举类型,则它在类定义中的声明可以指定一个常量初始化器,它应该是一个整型常量表达式.在这种情况下,成员可以在其范围内出现在整数常量表达式中.如果在程序中使用该成员,并且名称空间范围定义不包含初始化程序,则该成员仍应在名称空间作用域中定义.

基本上,本地类没有链接,静态数据成员需要链接.

由于无法在命名空间作用域中定义本地类的静态数据成员(具有初始化程序的声明不是定义),因此不允许使用它们,无论它们是否为const整数类型.从表面上看,似乎编译器应该能够内联值,但是如果您尝试访问指向该成员的指针会发生什么?使用命名空间范围的类,您只会收到链接器错误,但本地类没有链接.

我想在理论上他们可以只允许你在局部类中使用静态const积分类型,只要它们仅用于整数常量表达式,但它可能只会给标准体和编译器供应商带来太大的负担来区分实用价值很小; 本地静态变量可以从本地类访问,因此使用本地静态const应该同样好.


Joh*_*itb 5

我不认为有一个。原因。不允许使用普通静态数据成员,因为在声明后无法定义它们。

也不要忘记你可以在.class 之外创建一个局部const 变量,你可以在类内部使用它,只要你只读取它的值(也就是说,只要你不取.its.address)。