§ why is int i = i allowed in C++?

This bizarre program:
struct Foo { explicit Foo() {}; }
int main() { Foo foo = foo; cout << "works!"; return 0; }

actually works! Why is this allowed? The only real use-case I know for this is to write:
const int ARRSIZE = 200;
int *ptr = malloc(sizeof(ptr) * ARRSIZE);

Still, this seems awfully dodgy. It feels like the C speficiation could allow the use of the left-hand-side name in expression that only need type information while emitting compile time errors for expressions that use the left-hand-side-name as a value .