用例:
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 ++中不存在此功能;它背后的任何逻辑原因?
答案 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)
我的猜测是,在成员函数上使用static
和const
来引用静态成员变量的常量根本就不会被视为一个选项。 IMO你的建议是混合这两个关键词的一种奇怪的(但也许是明智的)方式。
答案 5 :(得分:1)
好问题。
我认为概念上的常量适用于明确定义的对象或数据结构。不是全球/静态等等。
同样地,我可能会问为什么全局(或者特定于命名空间的)函数可能不是const
,即它可能承诺不修改任何全局(或命名空间特定的)变量。
这并没有太多意义恕我直言。但是,是的,属于特定类的静态成员的常量 - 这个可能在某些情况下有用恕我直言。