You can't implement the assertions at compile time since they are predicates evaluated at runtime. This is also why it is a performance hit on the code. I chose to use C-style macros because it is easier to debug than templates.
Yes OLD stores the value of the variable before the execution of the DO.
This is because all of the virtual methods that have been overriden are visited in order to gather their assertions, but not execute their DO(). So while the assertions are being collected it also collects OLD() values which then can be tested at the called virtual method in its ENSURE() clause.
OLD is a complicated mechanism to implement in C++ because it requires saving current variables at the same time deferring the code to be executed.