Konstante Ausdrücke in Constexpr-Funktionen mit Referenzparametern
Beachten Sie den folgenden Codeausschnitt:
template <size_t S1, size_t S2> auto concatenate(const std::array<uint8_t, S1> &data1, const std::array<uint8_t, S2> &data2) { std::array<uint8_t, data1.size() + data2.size()> result; // Error: non-type template argument is not a constant expression ... }
Beim Kompilieren mit clang 6.0 mit -std=c 17, die Funktion kann aufgrund der Größe der Mitgliedsfunktion nicht kompiliert werden Array ist nicht constexpr, wenn es auf eine Referenz angewendet wird.
Standardbegründung
Der Grund für dieses Verhalten wird in [expr.const]/4 des C-Standards erläutert:
Ein Ausdruck ist kein Kernkonstantenausdruck, wenn er einen ID-Ausdruck auswertet, der auf eine Variable oder ein Datenelement verweist vom Referenztyp, es sei denn:
In diesem Fall hat der Referenzparameter data1 keine vorangehende Initialisierung und kann daher nicht im konstanten Ausdruck data1.size() verwendet werden. data2.size().
Lösung
Um das Problem zu beheben, ersetzen Sie einfach data1.size() durch den Vorlagenparameter S1:
std::array<uint8_t, S1 + S2> result;
Das obige ist der detaillierte Inhalt vonWarum funktioniert „data1.size()' nicht in einer „constexpr'-Funktion mit Referenzparametern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!