Heim > Backend-Entwicklung > C++ > Warum verursachen Referenzparameter Fehler in Constexpr-Funktionen?

Warum verursachen Referenzparameter Fehler in Constexpr-Funktionen?

Mary-Kate Olsen
Freigeben: 2024-12-15 17:57:15
Original
931 Leute haben es durchsucht

Why Do Reference Parameters Cause Errors in Constexpr Functions?

Verwirrung über Referenzparameter in Consexpr-Funktionen

Der folgende Codeausschnitt versucht, zwei Arrays von Bytes in einem neuen Array innerhalb einer Constexpr-Funktion zu verketten benannt verketten.

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 occurs here

    // ...
}
Nach dem Login kopieren

Allerdings bei Kompilierung mit Clang 6.0 unter Verwendung des C 17-Standards tritt ein Fehler auf: „Non-Type-Template-Argument ist kein konstanter Ausdruck.“ Dieser Fehler ist auf die Referenznatur der Funktionsparameter (Daten1 und Daten2) zurückzuführen.

Der Referenztyp im Funktionsparameter löst ein Problem aus, da konstante Ausdrücke keine Referenzen auswerten können, wie im C-Standard unter [expr. const]/4:

"Ein Ausdruck e ist ein Kernkonstantenausdruck, es sei denn, die Auswertung von e... würde einen ID-Ausdruck auswerten, der auf eine Variable oder ein Datenelement vom Referenztyp verweist, es sei denn, die Referenz hat eine vorhergehende Initialisierung.“

Da die Referenzparameter in diesem Fall keine vorhergehende Initialisierung haben, können sie nicht in einem konstanten Ausdruck verwendet werden.

Um dieses Problem zu beheben, kann der Code sein geändert, um die S1- und S2-Vorlagenparameter direkt zu verwenden, anstatt sich auf die size()-Memberfunktion der Referenzparameter zu verlassen:

std::array<uint8_t, S1 + S2> result;
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWarum verursachen Referenzparameter Fehler in Constexpr-Funktionen?. 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