用例:
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
对象中。
我的猜测是,在成员函数上使用static
和const
来引用静态成员变量的恒常性从未被视为一种选择。IMO 您的建议是一种混合这两个关键字的奇怪(但可能是明智的)方式。
好问题。
我相信概念上的恒定性适用于明确定义的对象或数据结构。不是全局/静态等。
同样,我可能会问为什么全局(或特定于命名空间的)函数可能不const
,即它可能承诺不修改任何全局(或特定于命名空间)的变量。
恕我直言,这没有多大意义。但是,是的,属于特定类的静态成员的恒定性 - 恕我直言,这在某些情况下可能很有用。