Qual é o comportamento de uma variável não inicializada usada como seu próprio inicializado

Notei agora que o código a seguir pode ser compilado com clang / gcc / clang ++ / g ++, usandoc99, c11, c++11 padrões

int main(void) {
    int i = i;
}

e mesmo com-Wall -Wextra, nenhum dos compiladores relata aviso

Modificando o código paraint i = i + 1; e com-Wall, eles podem relatar:

why.c:2:13: warning: variable 'i' is uninitialized when used within its own initialization [-Wuninitialized]
    int i = i + 1;
        ~   ^
1 warning generated.

Minhas perguntas

Por que isso é permitido pelos compiladores?O que os padrões C / C ++ dizem sobre isso? Especificamente, qual é o comportamento disso? UB ou implementação dependente?

questionAnswers(3)

yourAnswerToTheQuestion