why local variable doesn't hide the global variable in array definition

c++

Solution

The point of declaration for a variable (that is, the point at which the name assumes the meaning given to it by the declaration, hiding any other entities with the same name in a wider scope) comes after the declarator, and before any initialiser. So this:

int x = x;
     ^ point of declaration

initialises the local variable `x` with its own uninitialised value, giving undefined behaviour (although it's still well-formed, so the compiler shouldn't reject it unless you ask it to).

While this:

int x[x];
        ^ point of declaration

uses the global constant `x` within the declarator, which is well-formed and well-defined. It's potentially baffling for human readers, but no problem for the compiler.

The rationale for this rule is that it's reasonable to use the address (but not the value) of a variable in its own initialiser, a simple example being

void * p = &p;

Problem

I am reviewing subtle points in C++ these days. I found an interesting question. Could you please check it and share your reasoning why it works like that. Thank you ``` const int x = 5; void func() { // ! Error // int x = x; // ! Fine int x[x]; x[0] = 12; cout << x[0]; } ```

Original source