int a = 1 ist ein || 1 ein konstanter Ausdruck?

N4527 5.20 [expr.const] p5

Ein konstanter Ausdruck 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, in dem für dieses Objekt und sein Unterobjekte:

- jedes nicht statische Datenelement des Referenztyps verweist auf eine Entität, die ein zulässiges Ergebnis eines konstanten Ausdrucks ist, und

- 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 Nullzeigerwert.

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

void foo(){
    int a = 1;
    int b[a || 1]{};//ok in gcc 5.1.0, error in clang 3.8.0
    static_assert(a || 1,"");//ok in gcc 5.1.0, error in clang 3.8.0
    switch(1){
        case a || 1://ok in gcc 5.1.0, error in clang 3.8.0
            ;
        }
}

Ista || 1 a constant expression?

N4527 5.20 [expr.const] p2

Ein Bedingungsausdruck e ist ein konstanter Kernausdruck, es sei denn, die Auswertung von e nach den Regeln der abstrakten Maschine (1.9) würde einen der folgenden Ausdrücke auswerten:

(2.7) - eine 1-Wert-zu-R-Wert-Umwandlung (4.1), sofern sie nicht auf @ angewendet wi

(2.7.1) - ein nichtflüchtiger Wert vom Typ Integral oder Aufzählung, der sich auf ein vollständiges nichtflüchtiges const-Objekt mit einer vorhergehenden Initialisierung bezieht, das mit einem konstanten Ausdruck initialisiert wurde, oder

(2.7.2) - ein nichtflüchtiger Wert, der sich auf ein Unterobjekt eines Zeichenfolgenliteral (2.13.5) bezieht, oder

(2.7.3) - ein nichtflüchtiger Wert, der sich auf ein nichtflüchtiges Objekt bezieht, das mit constexpr definiert wurde, oder der sich auf ein nichtveränderliches Unterobjekt eines solchen Objekts bezieht, oder

(2.7.4) - Ein nichtflüchtiger Wert vom Typ Literal, der sich auf ein nichtflüchtiges Objekt bezieht, dessen Lebensdauer mit der Bewertung von e begonnen hat.

Ista || 1 a core konstanter Ausdruck?

Antworten auf die Frage(6)

Ihre Antwort auf die Frage