2016-04-05 3 views
1

Beiden GCC (5.3.0) und Clang (3.8.0) einig, dass dies gültige Code:Voraussetzungen für die (nicht-quite-) constexpr Vorlage Argument

constexpr std::integral_constant<size_t, 0> n{}; 
std::get<n>(std::make_tuple(123)); 

sie jedoch nicht einverstanden dazu:

std::integral_constant<size_t, 0> n; 
std::get<n>(std::make_tuple(123)); 

Clang ist in Ordnung, aber GCC meldet "der Wert von 'n' ist in einem konstanten Ausdruck nicht verwendbar"/'' n 'wurde nicht' constexpr '"deklariert.

Wessen Verhalten entspricht dem Standard?

Antwort

1

Clang ist richtig, obwohl es letztlich von Ihrer Bibliothek Implementierung abhängt. Der Standard verbietet per se nicht das Aufrufen einer constexpr-Funktion für ein nicht-const (expr) Objekt in konstanten Ausdrücken; nur die Verwendung der Mitglieder dieses Objekts wäre ein Problem (siehe [expr.const]/(2.7.3)). Da der Konvertierungsoperator ganz einfach 0 zurückgibt, handelt es sich wahrscheinlich um einen GCC-Fehler (der auch bei der Betrachtung der Fehlermeldung angezeigt ist).

Verwandte Themen