2016-05-17 2 views
7

Der folgende CodeEine consExpr-Methode durch eine Referenz aufrufen - ist das Ergebnis ein konstanter Ausdruck?

#include <array> 

void foo(const std::array<int, 42> &a) 
{ 
    constexpr size_t S = a.size(); 
} 

int main() {} 

kompiliert in GCC in Ordnung, aber nicht in Klirren mit der folgenden Fehlermeldung

main.cpp:5:28: error: constexpr variable 'S' must be initialized by a constant expression 
     constexpr size_t S = a.size(); 
          ^~~~~~~~ 

Inzwischen viele Beiträge über constexpr Fragen auf SO zu kompilieren scheinen, dass Klappern oft zu implizieren hat bessere (mehr pedantische?) Unterstützung für constexpr. Also, welcher Compiler wäre in diesem Fall korrekt?

Beachten Sie, dass beide Compiler den Code gerne akzeptieren, sobald der Referenzparameter durch den Pass-by-Value-Parameter ersetzt wurde.

Antwort

7

[expr.const]/2:

A bedingungsausdrucke ist ein konstanter Kern Ausdruck es sei denn die Bewertung der e, nach den Regeln der abstrakten Maschine ([intro.execution]), würde einen der folgenden Ausdrücke auswerten:

  • [...]
  • eine ID-expression, die vom Referenztyp eine Variablen oder Datenelement bezieht, wenn die Referenz eine vorangehende Initialisierung und entweder

    • es wird mit einem konstanten Ausdruck initialisiert oder
    • seine Lebensdauer innerhalb begann die Bewertung von e;
  • [...]

a.size() Auswerten werten die ID-expressiona, die "in eine Variable ... von Referenztyp bezieht sich" und hat keine vorhergehende Initialisierung. Es ist daher keine konstante Kernausprägung und somit kein konstanter Ausdruck.

Verwandte Themen