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



用例:

class A {
  static int s_common;
public:
  static int getCommon () const { s_common; };
};

通常,这会导致错误,如下所示:

错误:静态成员函数"static int A::getCommon()"不能有 简历限定符

这是因为const性只适用于 this 所指向的对象,而static成员函数中不存在该对象。

但是,如果允许,static成员函数的"常量"可以很容易地与static数据成员相关联。
为什么C++中不存在此功能;这背后有什么合乎逻辑的原因吗?

cv-qualifiers会影响函数的签名。因此,您可以:

class A {
  static int s_common;
public:
  static void getCommon () const {  };
  static void getCommon () {  };
};

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

我只是在这里猜测,可能还有其他原因。 :)

但是,如果允许,静态成员函数的"常量"可能很容易与静态数据成员相关联。

这就是您的问题变得混乱的地方。声明为 const 的非静态成员函数仍具有对静态数据成员的非const访问权限。const仅适用于this(即:非静态数据成员)。

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

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

在成员函数上使用const cv 限定符的基本原理是:
指示传递给成员函数的隐藏指针this是不可变的,并且无法修改。static成员函数没有隐藏this参数,因此static成员函数的const毫无意义。

但是,如果允许,静态成员函数的"常量"可能很容易与静态数据成员相关联。

这不是一开始就使用限定符const理由,这从你不能将 cv 限定符应用于自由函数这一事实中可以明显看出。cv-qualifiers过去和现在都是为this,即调用其函数

的对象。

不更改任何全局状态的函数是纯函数。C++11 引入了可能包括特定平台上[[pure]]的属性。

const的一个问题是它是函数类型的一部分。将该static const函数分配给"普通"函数指针需要特殊的转换、强制转换或衰减规则。正如Luchian所提到的,它将允许完全模棱两可的重载。

实质上,您描述的是从static成员形成一个单一实例对象,共享一个通用的、限定的间接访问路径。要使非常量对象显示为 const,必须通过某些内容访问它,但没有this 。它decltype会改变吗?没有好的答案。如果你想要所有这些,那么将它们显式地放在一个class对象中。

我的猜测是,在成员函数上使用staticconst来引用静态成员变量的恒常性从未被视为一种选择。IMO 您的建议是一种混合这两个关键字的奇怪(但可能是明智的)方式。

好问题。

我相信概念上的恒定性适用于明确定义的对象或数据结构。不是全局/静态等。

同样,我可能会问为什么全局(或特定于命名空间的)函数可能不const,即它可能承诺不修改任何全局(或特定于命名空间)的变量。

恕我直言,这没有多大意义。但是,是的,属于特定类的静态成员的恒定性 - 恕我直言,这在某些情况下可能很有用。

最新更新