Heim > Backend-Entwicklung > C++ > Wie kann ich den Fehler „Nicht-Typ-Vorlagenargument ist kein konstanter Ausdruck' in Constexpr-Funktionen mit Referenzen beheben?

Wie kann ich den Fehler „Nicht-Typ-Vorlagenargument ist kein konstanter Ausdruck' in Constexpr-Funktionen mit Referenzen beheben?

Linda Hamilton
Freigeben: 2024-12-04 02:30:09
Original
556 Leute haben es durchsucht

How Can I Resolve

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;

    // ...
}
Nach dem Login kopieren

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:

  • keinen hat vorangehende Initialisierung
  • Wurde vor der Auswertung des konstanten Ausdrucks erstellt

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;

    // ...
}
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage