Referenzieren nicht konstanter Parameter in Constexpr-Funktionen
Betrachten Sie die folgende Funktionsvorlage:
template <size_t S1, size_t S2> auto concatenate(const std::array<uint8_t, S1>& data1, const std::array<uint8_t, S2>& data2) { // Error in constexpr contexts due to reference parameter std::array<uint8_t, data1.size() + data2.size()> result; // ... }
Verwenden von Clang 6.0 Mit C 17 schlägt die Kompilierung dieses Codes fehl und es kommt die Fehlermeldung „Non-Type-Template-Argument ist keine Konstante.“ Ausdruck." Das Auswerten von Referenzen innerhalb von constexpr-Funktionen ist aufgrund möglicher Aliasing-Probleme problematisch.
Den Standard verstehen
Gemäß dem C-Standard ([expr.const]/4) ist an Ausdruck kann kein Kernkonstantenausdruck sein, wenn er zu einer Referenz ausgewertet wird, die:
Lösung
Um dieses Problem zu beheben, kann man die problematische Referenz ersetzen Parameter mit seinem entsprechenden Vorlagenparameter:
template <size_t S1, size_t S2> auto concatenate(const std::array<uint8_t, S1>& data1, const std::array<uint8_t, S2>& data2) { // Problem solved by using S1 + S2 instead std::array<uint8_t, S1 + S2> result; // ... }
Durch die direkte Verwendung der Vorlagenparameter entfällt die Notwendigkeit, Referenzen auszuwerten constexpr-Kontexte und stellen sicher, dass die Funktion in Auswertungen konstanter Ausdrücke verwendet werden kann.
Das obige ist der detaillierte Inhalt vonWie kann ich den Fehler „Nicht-Typ-Vorlagenargument ist kein konstanter Ausdruck' in Constexpr-Funktionen mit Referenzen beheben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!