AFAIU, even if you had a getter in the alias this:
---
import std.stdio;
struct ValueRestrictedInteger(int lowerBound, int upperBound) {
int value;
auto ref get() { return value; }
alias get this;
this (int rhs) { value = rhs; }
invariant() {
assert (value >= lowerBound && value <= upperBound);
}
void forDemonstrationOnly() {}
}
---
It would still not work:
---
unittest {
ValueRestrictedInteger!(0, 100) x = 0;
x -= 100; //is probably lowered to something like this:
// 1) invariant();
// 2) int* __temp = &x.value; // this is what get() does
// 3) invariant();
// 4) *__temp = *temp - 100;
//...
}
---
Obviously, 4) will not trigger the invariant because it doesn't
call any public functions.