gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:49:08 26 4
gpt4 key购买 nike

struct A
{
static void f();
};

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

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

你必须把 constexpr 放在两者上。

你可以把 inline 放在两者上,但你也可以省略其中之一。这很有用,你可以在类定义中省略 inline,这不是接口(interface)的重要信息。

但是 static 类成员的规则并没有真正意义。不应该和constexpr一致吗?

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

最佳答案

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

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

<强>1。静态成员

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

<强>2。静态全局

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

因此如果您被允许在成员的全局范围内使用它,那么就会出现歧义。

关于c++ - 为什么不允许将类成员定义的 `static` 关键字放在命名空间范围内?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32398987/

26 4 0