webentwicklung-frage-antwort-db.com.de

Constexpr, wenn nicht bool

Ich habe anscheinend etwas gefunden, über das Clang und GCC nicht einig sind. Hier ist der Code:

int main() {
  if constexpr (2) {}
}

Dies wird erfolgreich mit GCC 7.4.0 kompiliert, schlägt jedoch mit Clang 7.0.0 mit der folgenden Fehlermeldung fehl:

test.cpp:3:17: error: constexpr if condition evaluates to 2, which cannot be narrowed to type 'bool'
      [-Wc++11-narrowing]
  if constexpr (2) {}
                ^
1 error generated.

cppreference scheint "Verengung" nicht zu erwähnen, daher scheint dies ein Clang-Fehler zu sein, aber ich bin nicht ganz sicher. Wenn dies ein Fehler bei einem der Compiler ist, wurde er bereits gemeldet?

42
Indiana Kernick

Clang diagnostiziert unter diesen Absätzen

[stmt.if] (Hervorhebung von mir)

2 Wenn die if-Anweisung die Form if constexpr hat, muss der Wert der Bedingung ein kontextkonvertierter konstanter Ausdruck vom Typ bool sein ; Diese Form wird als constexpr if-Anweisung bezeichnet.

[expr.const]

4 Ein konvertierter konstanter Ausdruck vom Typ T ist ein Ausdruck, der implizit in Typ T konvertiert wird, wobei der konvertierte Ausdruck ein konstanter Ausdruck ist und die implizite Konvertierungssequenz nur enthält

  • integrale Conversions, die keine Conversions einschränken,

Wenn es nun um integrale Konvertierungen geht, wird eine Konvertierung in boolals integrale Konvertierung aufgeführt . Und es verengt sich im strengsten Sinne des Wortes, da ein Bool nicht alle Werte eines int darstellen kann. Die Diagnose ist also nicht ohne Grund.

Aber ich denke, es ist auch ziemlich vernünftig, die Tatsache in Betracht zu ziehen, dass eine Konvertierung in bool normalerweise dazu gedacht ist, auf "Wahrhaftigkeit" zu prüfen, und daher sollte die Verengung keine Rolle spielen. Es sieht aus wie ein kleiner Fehler im Standard1, wobei GCC den gesunden Menschenverstand einschlug und Clang sich im strengsten Sinne an den trockenen Buchstaben des Gesetzes hielt.


1 - Und es gibt einen Vorschlag, dies zu ändern .