2015-10-20 19 views
6

नहीं बना सकता मैं constexpr std :: सरणी बना सकते हैं:constexpr std :: वेक्टर

constexpr std::array<int,5> values {1,2,3,4,5}; 

यह ठीक काम करता है।

constexpr std::vector<int> vec = {1,2,3,4,5}; 

यह मुझे एक त्रुटि देता है::

the type 'const std::vector<int>' of constexpr variable 'vec' is not literal constexpr std::vector<int> vec = {1,2,3,4,5};

+9

औपचारिक रूप से, ऐसा इसलिए है क्योंकि 'वेक्टर' कन्स्ट्रक्टर को 'कॉन्टेक्सप्र' घोषित नहीं किया गया है। ऐसा क्यों घोषित नहीं किया जाता है? क्योंकि 'वेक्टर' कन्स्ट्रक्टर को आम तौर पर ढेर पर स्मृति आवंटित करने की आवश्यकता होती है, जो निश्चित रूप से रन टाइम पर ही किया जा सकता है। –

+0

@ इगोर टंडेटनिक, तो कॉन्स्टेक्स वेक्टर बनाने का कोई तरीका नहीं है? – Leo

+3

कोई नहीं है। आपको क्यों चाहिए होगा? यह मुझे थोड़ा समझ में आता है। 'वेक्टर' का पूरा बिंदु गतिशील रूप से आकार बदलने की क्षमता है। यदि आपको इसकी आवश्यकता नहीं है, तो बस 'std :: array' या सादा सरणी का उपयोग करें। –

उत्तर

9

AFAIK std::vector<> की initlializer_list निर्माता constexpr घोषित नहीं किया गया है लेकिन मैं constexpr वेक्टर नहीं बना सकते।

9

std::vector एक गतिशील स्मृति आवंटन का उपयोग करता है। ऑपरेटर new का उपयोग constexpr विधियों में नहीं किया जा सकता है, इस प्रकार std::vector कभी भी constexpr नहीं होगा, इसके लिए constexpr कन्स्ट्रक्टर घोषित नहीं किया जा सकता है। std::array गतिशील स्मृति आवंटन का उपयोग नहीं करता है, इसे ढेर में आवंटित किया जाता है। सृजन constexpr वस्तुओं के नियमों के साथ इसमें कोई समस्या नहीं है और यह समेकित हो सकता है।

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