On Saturday, 4 August 2012 at 06:53:16 UTC, Mehrdad wrote:
It's worth pointing out the obvious, I.e. that as long as 'const' is physical const instead of logical const (which is always), invariants and contracts can't be const, because that would restrict them from calling methods that are logically but not physically const.

So I think they probably shouldn't be const.

As mentioned before, doesn't 'const' _only_ apply to the current (this) object and not anything else? Besides the contracts can't have lasting side effects that would change logical execution. How would changing the current object in an invariant be correct in release code?

I'm not sure if the contracts should have many (or any) restrictions, but at the same time if you remove the contracts, nothing in the code should change the execution; Example: using writeln in an invariant should not change the current object/structure in any form, or anything it is part of. Although not writeln is not 'pure', const shouldn't prevent you from using it (pure or @safe declarations may withhold you).

Reply via email to