Attualmente sto creando una classe con un costruttore constexpr
e mi chiedo se posso usare un std::array
per memorizzare i dati di questa classe. Lo standard specifica esplicitamente che un std::array
ha un costruttore constexpr
e che il suo contenuto è accessibile in fase di compilazione?È possibile utilizzare std :: array in una classe constexpr?
risposta
Poiché std::array<T, N>
è un aggregato, può essere inizializzata come constexpr
se e solo se il tipo sottostante T
ha un costruttore constexpr
(quando sono presentati con ogni inizializzatore fornite).
Sulla base del commento di @MarkGlisse: questo compiles
#include <array>
#include <iostream>
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;
int main()
{
}
credo di aver trovato la citazione pertinente dal standard qui:
12.1 Costruttori [class.ctor]
6 Un costruttore predefinito che è impostato per default e non definito come cancellato è definito implicitamente quando è od rused (3.2) per creare un oggetto del suo tipo di classe (1.8) o quando è esplicitamente impostato dopo la prima dichiarazione . Il costruttore predefinito definito implicitamente esegue il set di inizializzazioni della classe che verrebbe eseguito da un costruttore predefinito scritto dall'utente senza quella iniziatore-ctor (12.6.2) e un'istruzione composta vuota. Se il costruttore predefinito scritto dall'utente non è ben formato, il programma è mal formato. Se tale costruttore predefinito scritto dall'utente soddisferà i requisiti di un costruttore di constexpr (7.1.5), il costruttore predefinito predefinito di è constexpr.
Sembra essenzialmente la risposta di @ BenVoigt.
'#include
@MarcGlisse Prova ad aggiungere' constexpr' davanti a 'a' e' X', e non verrà compilato! – TemplateRex
'#include
- 1. constexpr std :: array con static_assert
- 2. Perché è necessario inizializzare un membro di array non statico in una classe constexpr?
- 3. Impossibile creare std :: vector constexpr
- 4. È possibile utilizzare una variabile di template `constexpr` come predefinita per un argomento di template formale
- 5. In che modo è possibile inizializzare una stringa std :: array di std :: pairs? Errore di
- 6. Perché non è std :: atomic_is_lock_free un constexpr statico?
- 7. È possibile implementare addressof() come funzione constexpr?
- 8. È std :: array mobile?
- 9. È possibile utilizzare RedirectToAction() all'interno di una classe AuthorizeAttribute personalizzata?
- 10. È possibile utilizzare boost :: serializzazione con classe gestita?
- 11. È possibile dichiarare la classe constexpr in un'intestazione e definirla in un file .cpp separato?
- 12. Perché std :: array :: size constexpr con tipi semplici (int, double, ...) ma non std :: vector (GCC)?
- 13. È possibile utilizzare boost :: foreach con std :: map?
- 14. Come posso utilizzare una funzione constexpr durante l'espansione del pacchetto?
- 15. È possibile utilizzare una funzione lambda per un parametro template?
- 16. È possibile utilizzare std :: string senza #include <string>?
- 17. È possibile creare un'estensione di array in Swift che è limitato a una classe?
- 18. Perché non è abs constexpr?
- 19. Perché è richiesto constexpr anche se la funzione membro è constexpr?
- 20. errore quando si istanzia std :: array utilizzando std :: matrice :: size
- 21. È possibile utilizzare std :: enable_if per selezionare una specializzazione del modello membro?
- 22. È possibile utilizzare una dll in C# in un'applicazione golang
- 23. È possibile utilizzare una barra di avanzamento in una classe esterna a main?
- 24. È possibile utilizzare un elenco di inizializzazione di una Lambda in una classe?
- 25. È possibile utilizzare una variabile JavaScript in formato HTML semplice?
- 26. È possibile scrivere una funzione per std :: string e std :: wstring?
- 27. Creare un modello variadic da un array constexpr
- 28. Array associativo in Delphi, array con chiave stringa è possibile?
- 29. C++ 11 std :: array
- 30. PHP - utilizzare array come classe costante
'std :: array' non ha un costruttore' constexpr' per quanto ne so. –
'std :: array' non ha un costruttore (definito dall'utente). È un aggregato. – chris
Si noti che sebbene sia possibile memorizzare i dati, sarà più difficile estrapolarli in modo constexpr. –