Alle Konstruktoren von std :: span sind als constexpr deklariert, aber ich kann anscheinend keinen von ihnen dazu bringen, in einem constexpr-Kontext zu arbeiten. Das Kommentieren eines der folgenden Constexpr führt zu einem Kompilierungsfehler.
#include <array>
#include <span>
int main()
{
constexpr int carray[3] = { 0, 1, 2 };
constexpr std::array<int, 3> array{ 0, 1, 2 };
using S = std::span<const int, 3>;
/*constexpr*/ S span1{ array.data(), 3 };
/*constexpr*/ S span2{array.begin(), array.end()};
/*constexpr*/ S span3{carray};
/*constexpr*/ S span4{array};
}
Ist es tatsächlich möglich, einen constexpr span-Typ zu erstellen, da Konstruktoren anscheinend niemals zur Kompilierungszeit ausgewertet werden können, wenn sie einen Zeiger oder eine Referenz initialisieren müssen?
Antworten:
Sie können in einem solchen konstanten Ausdruck keine lokalen Variablen mit nicht statischer Funktion verwenden. Sie benötigen Adressstabilität und dies wird nur durch statische Objekte erreicht. Ändern des Codes in
oder
Ermöglicht das Erstellen eines
constexpr
std::span
.quelle
constexpr
Funktion sind (ohne explizitestatic
). Haben solche Objekte eine statische Standardspeicherdauer oder ist dies etwas anderes?