Почему следующее вызывает ошибку компилятора:
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 ().