为什么类的静态成员函数没有"const-correctness"的概念?

iam*_*ind 11 c++ const-correctness static-members

使用案例:

class A {
  static int s_common;
public:
  static int getCommon () const { s_common; };
};
Run Code Online (Sandbox Code Playgroud)

通常,这会导致错误:

错误:静态成员函数'static int A :: getCommon()'不能有cv-qualifier

这是因为constness仅适用于指向的对象this,而该对象在static成员函数中不存在.

但是如果允许的话,static成员函数的"const"可能很容易与static数据成员相关.
为什么C++中不存在此功能; 它背后的任何逻辑原因?

Nic*_*las 8

但是如果允许的话,静态成员函数的"const"可能很容易与静态数据成员相关.

这是你的问题变得困惑的地方.声明为静态成员函数const仍然const无法访问静态数据成员.将const仅适用于this(即:非静态数据成员).

静态成员函数const在语法上以相同的方式使用,但具有完全不同的结果(即:访问静态数据成员const)是没有意义的.

此外,静态数据成员只不过是具有类访问控制(公共/私有/等)的类范围全局变量.因此,某些功能const对它们具有不同的访问权限是没有意义的,尤其是基于它们的签名.


Luc*_*ore 7

cv-qualifiers影响功能的签名.所以你可以:

class A {
  static int s_common;
public:
  static void getCommon () const {  };
  static void getCommon () {  };
};
Run Code Online (Sandbox Code Playgroud)

现在......你怎么称呼那个const?没有const对象可以调用它(好吧,你可以在一个const对象上调用它,但这不是重点).

我只是猜测,可能还有其他原因.:)

  • 这种组合可能被视为非法.我不确定它是否足以排除这种可能性. (3认同)
  • @MichaelAnderson为什么会违法?标准说你可以通过cv-qualifiers重载.如果我们足够改变规则,任何事情都可能被视为非法. (2认同)

Alo*_*ave 5

const在成员函数上使用cv-qualifier 的基本原理是:
指示this传递给成员函数的隐藏指针是不可变的,并且不能修改它.甲static成员函数不具有隐藏this参数,并且因此const对于static成员函数是无意义的.

但是如果允许的话,静态成员函数的"const"可能很容易与静态数据成员相关.

这不是const开始使用限定符的基本原理,这可以从你不能将cv-qualifiers应用于自由函数的事实中看出来.在cv-qualifiers过去和现在都只是针对this,其功能被调用的对象.