2013-01-10 12 views
25

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

+0

'std :: array' में मेरे सर्वोत्तम ज्ञान के लिए 'constexpr' कन्स्ट्रक्टर नहीं है –

+10

' std :: array' में कोई (उपयोगकर्ता परिभाषित) कन्स्ट्रक्टर नहीं है। यह एक कुल है। – chris

+1

ध्यान दें कि यद्यपि आप डेटा स्टोर कर सकते हैं, आपको एक कॉन्सएक्सप्रस तरीके से निकालने में कठिन समय लगेगा। –

उत्तर

21

क्योंकि std::array<T, N> एक समग्र है, यह एक constexpr के रूप में प्रारंभ किया जा सकता है यदि और केवल यदि अंतर्निहित प्रकार T एक constexpr निर्माता है (जब प्रत्येक प्रारंभकर्ता उपलब्ध कराने के साथ प्रस्तुत)।

7

@MarkGlisse द्वारा टिप्पणी के आधार पर: इस 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() 
{   
} 

मेरा मानना ​​है कि मैं स्टैंडर्ड यहां से प्रासंगिक उद्धरण पाया है:

12,1 कंस्ट्रक्टर्स [class.ctor]

6 डिफॉल्ट कन्स्ट्रक्टर जिसे डिफॉल्ट किया गया है और हटाए गए अनुसार नहीं किया गया है यह ओडी होने पर निहित रूप से def ned है वर्ग प्रकार (1.8) का ऑब्जेक्ट बनाने के लिए या जब इसे स्पष्ट रूप से घोषणा के बाद स्पष्ट रूप से डिफॉल्ट किया गया है, तो इसका उपयोग किया गया। निहित रूप से डिफॉल्ट डिफॉल्ट कन्स्ट्रक्टर कक्षा के प्रारंभिक सेटों का सेट करता है जो द्वारा उस श्रेणी के उपयोगकर्ता द्वारा लिखित डिफ़ॉल्ट कन्स्ट्रक्टर द्वारा सीटीओआर-प्रारंभकर्ता (12.6.2) और एक खाली यौगिक-कथन के साथ किया जाएगा। यदि वह उपयोगकर्ता-लिखित डिफ़ॉल्ट कन्स्ट्रक्टर बीमार हो जाएगा, तो प्रोग्राम खराब गठित है। यदि वह उपयोगकर्ता-लिखित डिफ़ॉल्ट कन्स्ट्रक्टर कॉन्स्टेक्सर कन्स्ट्रक्टर (7.1.5) की आवश्यकताओं को पूरा करेगा, तो निश्चित रूप से डिफाईड डिफ़ॉल्ट कन्स्ट्रक्टर constexpr है।

यह अनिवार्य रूप से @ बेनवोइग के उत्तर की तरह दिखता है।

+0

'# शामिल # शामिल टेम्पलेट struct X { constexpr एक्स (std :: सरणी और एक): आगमन (क) {} निजी: एसटीडी: : सरणी arr; }; std :: array a = {13, 18}; एक्स x = a; 'मेरे लिए संकलित करता है ... –

+0

@MarcGlisse 'a' और' X' के सामने' constexpr' जोड़ने का प्रयास करें, और यह संकलित नहीं होगा! – TemplateRex

+0

'# शामिल # शामिल टेम्पलेट struct एक्स { constexpr एक्स (स्थिरांक std :: सरणी और एक): आगमन (क) {} निजी: std :: array arr; }; constexpr std :: array a = {13, 18}; constexpr एक्स x = a; ' बस ठीक है। –

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

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