The C++ standard states that "The point of declaration for a name is immediately after its complete declarator (Clause 8) and before its initializer (if any) [...] ." Consider the following declarations:
int i = i;
Examining the grammar reveals that in both declarations the complete declarator ends before the '=' and '(' respectively, and that the second use of the name is in the initializer and not the declarator. Therefore the C++ scoping rules say that in both cases the name refers to the object being declared (and so the object is initialized with its own indeterminant value).
Visual Studio's C++ compiler does behave this way in the former case, but not in the latter. In the latter case the compiler behaves as though the point of declaration is after the closing ')', and it is possible to produce programs that behave incorrectly based on this.
 C++ 2011 FDIS n3290: § 3.3.2 Point of declaration
 C++ 2011 FDIS n3290: § 8.5 Initializers
 C++ 2011 FDIS n3290: § 3.3.3 Block scope