c++ 为什么不允许将类成员定义的`static`关键字放在命名空间作用域中?

rn0zuynd  于 2023-05-02  发布在  其他
关注(0)|答案(2)|浏览(114)
struct A
{
  static void f();
};

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

为什么不允许?我问这个问题是因为这个规则似乎与其他关键字不一致。
您必须在两者上都设置constexpr
您可以将inline放在两个上面,但也可以省略其中一个。这是有用的,你可以在类定义中省略inline,这不是接口的重要信息。
但是static在类成员上的规则实际上没有意义。它不应该与constexpr一致吗?
我知道static意味着命名空间范围函数的内部链接,这部分解释了当前的形状。但是自由函数和类成员函数之间的区别不是在命名空间范围内没有歧义吗?例如,如果你写static void A::f() {},如果A是一个类名,那么你定义的是A的一个成员函数。

bakd9h0s

bakd9h0s1#

类中的static在全局或命名空间中有其他含义。
当你在类中声明symbol为static时,你不希望它是一个全局static。

1.静态成员

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

2.静态全局

在全局范围内,static表示对象或函数仅是本地的,不能导出(如使用extern)到其他文件。此外,它还允许您在其他文件中为其他变量使用相同名称。因此,如果它位于头文件中,则包括头文件在内的任何文件都将具有该符号的不同示例。

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

ifsvaxew

ifsvaxew2#

static不是唯一一个不允许在类成员函数的行外定义中使用的说明符。virtualexplicit也不是。
基本上,对类成员有特殊含义的说明符不允许出现在行外定义中。static对于类成员和其他实体具有不同的含义。virtualexplicit只对类成员有意义。另一种思考方式是,这些说明符定义了函数和它所属的类之间的关系,因此它们应该只出现在函数在类中的成员关系建立的地方。
inlineconstexpr对于类成员函数的含义与任何其他函数相同。

相关问题