11

用例:

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

通常这会导致错误:

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

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

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

4

6 回答 6

8

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

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

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

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

于 2012-04-11T06:07:08.880 回答
8

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

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

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

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

于 2012-04-11T06:14:43.583 回答
5

const在成员函数上使用 cv-qualifier的基本原理是:
表明this传递给成员函数的隐藏指针是不可变的,并且不能被修改。static成员函数没有隐藏this参数,因此对于成员函数来说是没有意义的conststatic

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

这不是一开始就有限定符的理由const,这从你不能将 cv 限定符应用于自由函数的事实中显而易见。cv-qualifierswere 和 are 仅用于this,其函数被调用的对象。

于 2012-04-11T06:06:25.630 回答
2

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

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

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

于 2012-04-11T06:19:37.777 回答
1

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

于 2012-04-11T06:05:12.853 回答
1

好问题。

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

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

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

于 2012-04-11T06:09:30.237 回答