Heim > Backend-Entwicklung > C++ > Warum funktioniert „data1.size()' nicht in einer „constexpr'-Funktion mit Referenzparametern?

Warum funktioniert „data1.size()' nicht in einer „constexpr'-Funktion mit Referenzparametern?

Patricia Arquette
Freigeben: 2024-11-29 07:53:13
Original
599 Leute haben es durchsucht

Why Doesn't `data1.size()` Work in a `constexpr` Function with Reference Parameters?

Konstante Ausdrücke in Constexpr-Funktionen mit Referenzparametern

Beachten Sie den folgenden Codeausschnitt:

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: non-type template argument is not a constant expression
    ...
}
Nach dem Login kopieren

Beim Kompilieren mit clang 6.0 mit -std=c 17, die Funktion kann aufgrund der Größe der Mitgliedsfunktion nicht kompiliert werden Array ist nicht constexpr, wenn es auf eine Referenz angewendet wird.

Standardbegründung

Der Grund für dieses Verhalten wird in [expr.const]/4 des C-Standards erläutert:

  • Ein Ausdruck ist kein Kernkonstantenausdruck, wenn er einen ID-Ausdruck auswertet, der auf eine Variable oder ein Datenelement verweist vom Referenztyp, es sei denn:

    • Die Referenz hat eine vorhergehende Initialisierung und kann in konstanten Ausdrücken verwendet werden
    • Die Lebensdauer der Referenz begann mit der Auswertung des Ausdrucks

In diesem Fall hat der Referenzparameter data1 keine vorangehende Initialisierung und kann daher nicht im konstanten Ausdruck data1.size() verwendet werden. data2.size().

Lösung

Um das Problem zu beheben, ersetzen Sie einfach data1.size() durch den Vorlagenparameter S1:

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

Das obige ist der detaillierte Inhalt vonWarum funktioniert „data1.size()' nicht in einer „constexpr'-Funktion mit Referenzparametern?. 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