2

为什么以下会引发编译器错误:

class A
{
public:
    int f() const
    {
        return 5;
    }

protected:
    invariant()
    {
        assert (f() == 5);
    }
}

main.d(14): Error: cannot call public/export function f from invariant.

我理解不变的概念;您想在每次公开调用方法之间检查类的状态。

但是,不可变或 const 成员函数不能改变类的状态(除非this通过了?),所以围绕这些函数的不变检查是多余的。可以将不变量调用放在一边,并且不会出现无限循环,从而导致编译器错误错误。


自从我使用对象创建层次结构以来,我就想到了这一点,这些对象定义:

bool hasParent() const
{
    return (parent !is null);
}

在课堂内使用这个小功能更容易,但也可能在课堂外使用。但是将其定义为 public 违反了 invariant()。

4

1 回答 1

1

这很可能是一个遗漏。随时在Bugzilla上提交增强请求。

于 2011-12-29T14:06:57.803 回答