Инвариант класса D, вызывающий константные функции - PullRequest
2 голосов
/ 29 декабря 2011

Почему следующее выдает ошибку компилятора:

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.

Я понимаю концепцию инварианта;вы хотите проверять состояние класса между каждым открытым вызовом метода.

Однако неизменяемые или константные функции-члены не могут изменять состояние класса (если не было передано this?), поэтому инвариантные проверкиокружающие эти функции излишни.Инвариантный вызов может быть оставлен в стороне, и бесконечный цикл не появится, что приведет к ошибке компилятора.


Я пришел к этому, поскольку создаю иерархии с объектами, которые определяют:

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

использовать эту маленькую функцию легче в классе, но, возможно, и за ее пределами.Но определение его public бросает вызов invariant ().

1 Ответ

1 голос
/ 29 декабря 2011

Скорее всего, это упущение. Не стесняйтесь подать запрос на улучшение на Bugzilla .

...