Ist ein glvalue integraler konstanter Ausdruck ein konstanter Ausdruck?

N4527 5.20 [expr.const] p3

Einintegraler konstanter Ausdruck ist ein Ausdruck vom Typ einer ganzzahligen oder nicht mit einem Gültigkeitsbereich versehenen Aufzählung, der implizit in einen Wert konvertiert wird, wobei der konvertierte Ausdruck ein konstanter Kernausdruck ist.

5.20 [expr.const] p5

A constant expression ist entweder ein glvalue-Kernkonstantenausdruck, dessen Wert sich auf eine Entität bezieht, die ein zulässiges Ergebnis eines konstanten Ausdrucks (wie unten definiert) ist, oder ein prvalue-Kernkonstantenausdruck, dessen Wert ein Objekt ist, bei dem für dieses Objekt und seine Unterobjekte:

(5.1) - jedes nicht statische Datenelement des Referenztyps bezieht sich auf eine Entität, die ein zulässiges Ergebnis eines konstanten Ausdrucks ist, und

(5.2) - Wenn das Objekt oder Unterobjekt vom Zeigertyp ist, enthält es die Adresse eines Objekts mit statischer Speicherdauer, die Adresse nach dem Ende eines solchen Objekts (5.7), die Adresse einer Funktion oder einen Nullzeiger Wert

Eine Entität ist ein zulässiges Ergebnis eines konstanten Ausdrucks, wenn es sich um ein Objekt mit @ handelstatic Speicherdauer das ist entweder kein temporäres Objekt oder ein temporäres Objekt, dessen Wert die obigen Bedingungen erfüllt, oder es ist eine Funktion.

void foo(){
    const int a = 1;//a has automatic storage duration
    // all ok in gcc 5.1.0 and clang 3.8.0
    int b[a]{};
    static_assert(a,"");
    switch(1){
      case a:
        ;
    }
}

Frage1: Ista einintegraler konstanter Ausdruck?

Frage2: Ista a constant expression?

Frage 3: Ist ein glvalue integraler konstanter Ausdruck ein konstanter Ausdruck?

Frage4:

Wenn die Antwort auf Frage 3 "Ja" lautet, widerspricht dies 5.20 p3, wenn das Objekt eine automatische Speicherdauer hat?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage