Heim > Backend-Entwicklung > C++ > Können Referenzparameter in C-Consexpr-Funktionen für konstante Ausdrücke verwendet werden?

Können Referenzparameter in C-Consexpr-Funktionen für konstante Ausdrücke verwendet werden?

Mary-Kate Olsen
Freigeben: 2024-11-29 01:54:09
Original
663 Leute haben es durchsucht

Can Reference Parameters Be Used in C   Constexpr Functions for Constant Expressions?

Referenzparameter in Consexpr-Funktionen und konstanten Ausdrücken

In C ist ein konstanter Ausdruck ein Ausdruck, der beim Kompilieren einen konstanten Wert ergibt. Zeit. Betrachten Sie die folgende constexpr-Funktion:

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; // Possible error here

    return result;
}
Nach dem Login kopieren

Beim Kompilieren dieser Funktion mit Clang 6.0 mit -std=c 17 schlägt die Kompilierung fehl, da der Ausdruck data1.size() zur Laufzeit ausgewertet wird. Dieser Fehler tritt nur auf, wenn es sich bei den Parametern um Referenzen handelt, was auf ein mögliches Missverständnis über das Verhalten von Referenzparametern in constexpr-Funktionen hinweist.

Gemäß dem C-Standard ([expr.const]/4) ist ein Ausdruck ein Kern konstanter Ausdruck, wenn seine Auswertung nicht die Auswertung eines ID-Ausdrucks beinhaltet, der auf eine Variable oder ein Datenelement vom Referenztyp verweist, es sei denn, er verfügt über eine vorhergehende Initialisierung, die entweder in konstanten Ausdrücken verwendbar ist, oder seine Lebensdauer begann innerhalb der Auswertung von der Kernkonstantenausdruck.

In der angegebenen Funktion haben die Referenzparameter keine vorangehende Initialisierung, wodurch ihre size()-Ausdrücke nicht konstant sind. Daher können sie nicht in einem konstanten Ausdruck verwendet werden, was zu einem Kompilierungsfehler führt.

Um das Problem zu beheben und die Referenzparameter in einem konstanten Ausdruck zu verwenden, können Sie einfach eine vorangehende Initialisierung bereitstellen oder data1.size( ersetzen) ) mit dem Template-Parameter S1.

Das obige ist der detaillierte Inhalt vonKönnen Referenzparameter in C-Consexpr-Funktionen für konstante Ausdrücke verwendet werden?. 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