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

时间:2012-04-11 05:58:39

标签: c++ static-members const-correctness

用例:

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

通常会导致错误:

  

错误:静态成员函数'static int A :: getCommon()'不能有   CV-限定符

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

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

6 个答案:

答案 0 :(得分:8)

  

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

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

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

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

答案 1 :(得分:7)

cv-qualifiers影响函数的签名。所以你可以:

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

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

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

答案 2 :(得分:5)

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

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

这不是开始使用const限定词的理由,这可以从你不能将cv-qualifiers应用于自由函数的事实中看出来。 cv-qualifiers只用于this,即调用其功能的对象。

答案 3 :(得分:2)

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

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

基本上,您正在描述从static成员构建单个对象,共享一个通用的合格间接访问路径。为了使非const对象显示为const,必须通过某些东西访问它,但是没有this。它的decltype会改变吗?没有好的答案。如果你想要所有这些,那么将它们明确地放在class对象中。

答案 4 :(得分:1)

我的猜测是,在成员函数上使用staticconst来引用静态成员变量的常量根本就不会被视为一个选项。 IMO你的建议是混合这两个关键词的一种奇怪的(但也许是明智的)方式。

答案 5 :(得分:1)

好问题。

我认为概念上的常量适用于明确定义的对象或数据结构。不是全球/静态等等。

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

这并没有太多意义恕我直言。但是,是的,属于特定类的静态成员的常量 - 这个可能在某些情况下有用恕我直言。