Heim >Backend-Entwicklung >C++ >Warum verhindert die Verwendung von „std::array'-Referenzparametern in einer C-Funktion die Auswertung konstanter Ausdrücke?

Warum verhindert die Verwendung von „std::array'-Referenzparametern in einer C-Funktion die Auswertung konstanter Ausdrücke?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-13 08:02:11264Durchsuche

Why Does Using `std::array` Reference Parameters in a C   Function Prevent Constant Expression Evaluation?

Referenzparameter und konstante Ausdrücke

Im bereitgestellten C-Code empfängt die Verkettungsfunktion zwei Referenzparameter vom Typ std::array. Der beim Kompilieren aufgetretene Fehler bezieht sich jedoch auf die Größenelementfunktion des Arrays, die aufgrund ihrer Referenznatur nicht als konstanter Ausdruck betrachtet wird.

Gemäß dem C-Standard ein Kern Ein konstanter Ausdruck ist definiert als ein Ausdruck, der nicht ausgewertet wird als:

  • Ein ID-Ausdruck (d. h. eine Referenz) auf a Variable oder Datenelement vom Referenztyp, es sei denn, die Referenz:

    • Hat eine vorhergehende Initialisierung
    • Ist in konstanten Ausdrücken verwendbar
    • Ihre Lebensdauer begann innerhalb der Auswertung des Ausdruck

In diesem Fall erfüllt der Referenzparameter zum Array keines dieser Kriterien. Ohne eine vorangehende Initialisierung kann die Referenz nicht als konstanter Ausdruck ausgewertet werden.

Da die Size-Member-Funktion daher für den Referenzparameter (d. h. data1.size()) aufgerufen wird, Es kann nicht als konstanter Ausdruck betrachtet werden, was zu einem Kompilierungsfehler führt.

Um dieses Problem zu beheben, wird empfohlen, die Vorlagenparameter S1 und S2 direkt zu verwenden, um die Größe des Ergebnisses zu bestimmen Array, anstatt sich auf die Größenelementfunktion der Referenzparameter zu verlassen:

auto result = std::array<uint8_t, S1 + S2>{};

Das obige ist der detaillierte Inhalt vonWarum verhindert die Verwendung von „std::array'-Referenzparametern in einer C-Funktion die Auswertung konstanter Ausdrücke?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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