I prefer avoiding code that does different things in debug and release.
Breaking in the debugger on a condition and having all file/line info is useful though, also the exact expression and the exact value.
Having an assert that would "evaluate the condition only in debug" may be a performance optimization, and as such, useful only in 0.0001% of programs - where people know what they are doing. In all other cases this is harmful, as the expression may actually change program's state:
assert(2 == ShroedingersCat.GetNumEars());
would make the program do different things in debug and release.
We have developed a set of assert macros which would throw an exception, and do it in both debug and release version. For instance, THROW_UNLESS_EQ(a, 20); would throw an exception with what() message having both file, line and the actual values of a, and so on. Only a macro would have the power for this. The debugger may be configured to break at 'throw' of the specific exception type.