常量静态成员函数:有另一种方法可用吗?



如本问答中所报告的那样,常量静态成员函数在C++中不可用。从那以后(2011年(有什么变化吗?

有没有另一种方法可以让静态成员函数不修改其类的静态成员?

类似的东西(伪代码(:

class C
{
static int a;
public:
static void Incr() { ++a; }
static int  Ret() const { return a; }
};
int C::a = 0;

我需要从另一个类的 const 成员函数调用 [const] 静态成员函数。

根据当前 cppreference.com(关于静态成员的页面(,静态成员函数仍然不能是 const,因为 const 关键字只修改了this指针,而静态函数显然没有。

因此,自从您所指的答案被写出来以来,似乎没有任何变化。

从那以后(2011年(有什么变化吗?

没有任何变化,您仍然无法对静态成员函数进行 cv 限定。

有没有另一种方法可以让静态成员函数不修改其类的静态成员?

不是一个完美的解决方案,但你可以向静态数据成员声明 const "alias":

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
}

它仍然需要纪律,但至少这样编译器可以捕获意外的修改尝试。

只有静态字段和静态方法的类不值得被称为类。它只是函数和全局变量的形式,具有花哨的名称间距。

无论如何,IMO 最好有一个带有常规字段和方法的常规类,然后将其实例化为全局变量(不是很好的解决方案,但至少在类仅包含静态字段和方法的情况下更诚实(。

class C
{
int a;
public:
C() : a(0) {}
void Incr() { ++a; }
int  Ret() const { return a; }
};
C instance;

或者使用我讨厌的单例模式。

从生成的代码的角度来看,应该没有区别。

最新更新