2017-03-24 1 views
4

Ich habe 4 Testfälle und ich glaube, dass alle von ihnen gelten:constexpr mit unangetastet nicht-constexpr Argumente: Wer richtig, Klappern oder gcc ist?

constexpr int f(int const& /*unused*/){ 
    return 1; 
} 

void g(int const& p){ 
    constexpr int a = f(p); // clang error, gcc valid 

    int v = 0; 
    constexpr int b = f(v); // clang valid, gcc valid 

    int const& r = v; 
    constexpr int c = f(r); // clang error, gcc error 

    int n = p; 
    constexpr int d = f(n); // clang valid, gcc valid 
} 

int main(){ 
    int p = 0; 
    g(p); 
} 

Clang und GCC nur im ersten Testfall abweichen.

Ich testete mit clang 4 & 5 (20170319) und mit GCC 7.0.1 (20170221).

Wenn ich Recht habe wäre es massiv die Verwendung von boost :: hana in static_assert des vereinfachen.

Antwort

3

[expr.const]/2:

Ein Ausdruck e ist ein Kern konstanter Ausdruck es sei denn, die Auswertung von e, nach den Regeln der abstrakten Maschine, würde eine der folgenden Ausdrücke auswerten:

  • [...]
  • ein ID-expression, dass, wenn der Verweis auf ein variable oder Datenelement von Referenztyp bezieht hat einen vorstehenden Initialisierung und entweder

    • es mit einem konstanten Ausdruck oder

    • seine Lebensdauer innerhalb initialisiert begann die Bewertung von e;

  • [...]

Weder Zustand ist für p oder r zufrieden. Daher weder f(p) noch f(r) ist ein Kern konstanter Ausdruck und kann daher weder verwendet werden, um eine constexpr Variable zu initialisieren. Clang ist richtig.

Verwandte Themen