2013-11-27 16 views
14

La seguente non viene compilato se non ho messo constexpr prima initializer_list:Perché è richiesto constexpr anche se la funzione membro è constexpr?

constexpr std::initializer_list<int> il = { 
    1, 2, 3, 4, 5, 6, 7, 8, 9, 10 
}; 
std::array<int, il.size()> a; 

Ma initializer_list dimensione è constexpr:

constexpr size_type size() const; 
+1

Non è nemmeno chiaro se 'constexpr std :: initializer_list li = {..};' è valido in C++ 11; sarà in C++ 1y. – dyp

risposta

32
std::initializer_list<int> il = rand() ? std::initializer_list<int>{1} 
             : std::initializer_list<int>{1,2,3}; 

std::array<int, il.size()> a; 

è così perché.

Una funzione membro constexpr è una funzione che può essere eseguita all'interno di un'espressione costante, non produce necessariamente un risultato che è una costante in fase di compilazione. Per esempio:

struct S 
{ 
    int m; 
    constexpr int foo() const { return m; } 
}; 

S s{rand()}; 
int j = s.foo();  // only known at run-time 

constexpr S cs{42}; 
int arr[cs.foo()]; // compile-time constant 
2

Scrivendo std::array<int, il.size()> a; si richieda che il.size() possono essere valutati al momento della compilazione con un risultato costante, permettendo modello di istanza.

Ecco perché sia ​​il metodo initializer_list::size() e la tua il necessità variabile da dichiarare secondo quanto constexpr.

Problemi correlati