Инвариант класса D, вызывающий константные функции

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

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);
}

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


person Taco de Wolff    schedule 29.12.2011    source источник


Ответы (1)


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

person Vladimir Panteleev    schedule 29.12.2011