2013-11-27 11 views
14

Die folgende nicht kompiliert, wenn ich vor initializer_list setzen constexpr:Warum ist constexpr erforderlich, obwohl die Mitgliedsfunktion constexpr ist?

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

Aber initializer_list Größe ist constexpr:

constexpr size_type size() const; 
+1

Es ist nicht einmal klar, ob 'conexpr std :: initializer_list li = {..}; 'ist gültig in C++ 11; es wird in C++ 1J sein. – dyp

Antwort

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; 

deshalb.

A constexpr Elementfunktion ist eine Funktion, kann innerhalb eines konstanten Ausdrucks ausgeführt werden, es muss nicht unbedingt ein Ergebnis erhalten, das eine Übersetzungszeit konstant ist. Zum Beispiel:

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

von std::array<int, il.size()> a; Schreiben Sie behauptet, dass il.size() kann mit einem konstanten Ergebnis bei der Kompilierung ausgewertet werden, Template-Instantiierung ermöglicht.

, deshalb, sowohl die initializer_list::size() Methode und Ihre il Variable Notwendigkeit, als constexpr deklariert werden.