Hello Nick,
Interesting idea, but IMO using NaN as a default initializer is just a crutch for not having a real system of compile-time detecting/preventing of uninitialized variables from being read (C#'s system for this works very well in my experience).
I think you can prove that it is impossible to do this totally correctly: int i;for(int j = foo(); j > 0; j--) i = bar(j); // what if foo() returns -5?