2013-01-10 21 views
25

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?

+0

'std :: array' non ha un costruttore' constexpr' per quanto ne so. –

+10

'std :: array' non ha un costruttore (definito dall'utente). È un aggregato. – chris

+1

Si noti che sebbene sia possibile memorizzare i dati, sarà più difficile estrapolarli in modo constexpr. –

risposta

21

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).

7

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.

+0

'#include #include template struct X { constexpr X (std :: array di & a): arr (a) {} privato: std: : array arr; }; std :: array a = {13, 18}; X x = a; 'compila per me ... –

+0

@MarcGlisse Prova ad aggiungere' constexpr' davanti a 'a' e' X', e non verrà compilato! – TemplateRex

+0

'#include #include template struct X { constexpr X (std :: const serie & a): arr (a) {} privato: std :: array arr; }; constexpr std :: array a = {13, 18}; constexpr X x = a; ' compila bene. –

Problemi correlati