Kann std::array verwendet werden, in einer constexpr-Klasse?
Ich bin derzeit am erstellen einer Klasse mit einem constexpr
Konstruktor und ich Frage mich, ob ich verwenden kann, ein std::array
zum speichern der Daten dieser Klasse. Hat der standard explizit angeben, dass eine std::array
hat eine constexpr
Konstruktor und dessen Inhalt zugegriffen werden kann zur compile-Zeit ?
std::array
keinenconstexpr
Konstruktor, um die nach meinem besten wissenstd::array
hat keine (Benutzer-definiert) - Konstruktor. Es ist ein Aggregat.- Beachten Sie, dass obwohl Sie können die Daten zu speichern, müssen Sie einen schwieriger Zeit, extrahieren Sie es in ein constexpr Weg.
- Es gibt mehrere library-Fehler aus, fügen
constexpr
auf verschiedene Funktionen. So können Sie nicht bekommen Sie Ihre Daten in einerconstexpr
Weise in C++11, aber diese sollten aufgelöst werden in die nächste Sprache-version (und ggf. früher je nach Bibliothek implementor) zu markieren, die meisten von Ihnen (alle?) alsconstexpr
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Weil
std::array<T, N>
ist ein Aggregat, es kann initialisiert werden, alsconstexpr
wenn und nur dann, wenn der zugrunde liegende TypT
hat eineconstexpr
Konstruktor (wenn vorgestellt mit jeder Initialisierung, die Sie zur Verfügung stellen).Basiert auf den Kommentar von @MarkGlisse: diese kompiliert
Ich glaube, ich habe gefunden das relevante Zitat aus dem Standard hier:
12.1 Konstruktoren [Klasse.ctor]
Dieser sieht im wesentlichen wie @BenVoigt Antwort.
#include <cstdlib> #include <array> template<typename T, std::size_t N> struct X { constexpr X(std::array<T,N>& a):arr(a){} private: std::array<T,N> arr; }; std::array<int,2> a = { 13, 18 }; X<int,2> x = a;
kompiliert für mich...constexpr
vora
undX
, und es wird nicht kompiliert!#include <cstdlib> #include <array> template<typename T, std::size_t N> struct X { constexpr X(const std::array<T,N>& a):arr(a){} private: std::array<T,N> arr; }; constexpr std::array<int,2> a = { 13, 18 }; constexpr X<int,2> x = a;
kompiliert einwandfrei.