为什么不允许在命名空间范围内为类成员定义放置`static`关键字?

时间:2015-09-04 13:13:26

标签: c++ language-lawyer

struct A
{
  static void f();
};

static void A::f() {} //illegal

为什么不允许这样做?我问这个是因为规则似乎与其他关键字不一致。

您必须将constexpr放在两者上。

您可以将inline放在两者上,但也可以省略其中一个。这很有用,您可以在类定义中省略inline,这不是界面的重要信息。

static对班级成员的规则并没有多大意义。它不应该与constexpr一致吗?

我知道static表示命名空间范围函数的内部链接,这部分解释了当前的形状。但是,在命名空间范围内没有歧义的自由函数和类成员函数之间没有区别吗?例如,如果您编写static void A::f() {},那么如果A是类名,则明确定义A的成员函数是明确的。

1 个答案:

答案 0 :(得分:0)

类中的static具有全局或命名空间中静态的其他含义。

当您在类中将符号声明为静态时,您不希望它是全局静态。

<强> 1。静态成员

在类中,它表示符号是类相关而不是对象相关,表示成员变量,所有对象只有一个实例,而对于函数,它不能访问非静态成员,它们是面向对象。

<强> 2。静态全球

在全局范围内,static表示对象或函数仅为本地,并且无法导出(如使用extern)到其他文件。另外,它允许您在其他文件中使用相同的名称作为其他变量。因此,如果它位于头文件中,任何包含标题的文件都将具有不同的符号实例。

因此如果您被允许在成员的全局范围内使用它,则存在歧义。