正如this Q&A中所报道的,常量静态成员函数在C++中不可用。从那以后(2011)有什么变化吗?
有没有其他方法可以让静态成员函数不修改其类的静态成员?
类似于(伪代码):
class C
{
static int a;
public:
static void Incr() { ++a; }
static int Ret() const { return a; }
};
int C::a = 0;我需要从另一个类的const成员函数中调用一个const静态成员函数。
发布于 2019-09-16 23:24:36
根据当前的cppreference.com (关于static members的页面),静态成员函数仍然不能是const,因为const关键字只修改this指针,而静态函数显然没有。
所以自从你提到的答案写出来之后,似乎什么都没有改变。
发布于 2019-09-16 23:27:08
从那以后(2011),
有什么改变吗?
没有任何改变,你仍然不能对静态成员函数进行cv限定。
有没有其他方法可以让静态成员函数不修改其类的静态成员?
这不是一个完美的解决方案,但您可以为静态数据成员声明常量“别名”:
static int Ret() {
static constexpr const auto& a = C::a;
// Now C::a is shadowed by the local a
// and the function can't modify it.
// a = 2; // ill-formed
return a * 2; // OK
}它仍然需要纪律,但至少这样编译器可以捕获意外的修改尝试。
发布于 2019-09-16 23:56:09
只有静态字段和静态方法的类不值得被称为class。它只是函数和全局变量的形式,具有奇特的名称间距。
无论如何,最好是有一个包含常规字段和方法的常规类,然后将其实例化为全局变量(这不是一个很好的解决方案,但至少在类只包含静态字段和方法的情况下更诚实)。
class C
{
int a;
public:
C() : a(0) {}
void Incr() { ++a; }
int Ret() const { return a; }
};
C instance;或者使用我讨厌的单例模式。
从生成代码的角度来看,应该没有区别。
https://stackoverflow.com/questions/57959862
复制相似问题