2013-11-27 13 views
14

निम्नलिखित संकलन नहीं है जब तक कि मैं initializer_list से पहले constexpr डाल:सदस्य फ़ंक्शन समेकित होने के बावजूद constexpr क्यों आवश्यक है?

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

लेकिन initializer_list आकार constexpr है:

constexpr size_type size() const; 
+1

यह स्पष्ट नहीं है कि 'constexpr std :: startizer_list li = {..}; 'C++ 11 में मान्य है; यह सी ++ 1y में होगा। – dyp

उत्तर

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; 

यही कारण है कि है।

constexpr सदस्य फ़ंक्शन एक फ़ंक्शन है जो निरंतर अभिव्यक्ति के भीतर निष्पादित किया जा सकता है, यह आवश्यक रूप से एक संकलन-समय निरंतर परिणाम उत्पन्न नहीं करता है। उदाहरण के लिए:

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

लेखन std::array<int, il.size()> a; आप दावा कर रहे हैं कि il.size() एक निरंतर परिणाम के साथ संकलन समय पर मूल्यांकन किया जा सकता, टेम्पलेट इन्स्टेन्शियशन की अनुमति देकर।

क्यों दोनों initializer_list::size() विधि और अपने il चर की जरूरत के रूप में constexpr घोषित किया जा रहा है यही कारण है कि।

संबंधित मुद्दे