2017-02-02 12 views
8
int x = 1; // Not Constant 

class A { 
    public: 
     int value = x; 
     int value2 { x }; 
     A(int a)  : value(x), value2(x) {} 
     A(int a, int b) : value{ x }, value2{ x } {} 
     constexpr A() : value{ 0 }, value2{ 0 } {} 
}; 

constexpr int function(A obj1, A obj2, A obj3, A obj4, A obj5, A obj6, A obj7){ 
    return 1; 
} 

int main(){ 

    int y = 2; // Not Constant 
    A obj1 (y); 
    A obj2 { y }; 
    A obj3 = y ; 
    A obj4 = { y }; 
    A obj5 (y, y); 
    A obj6 { y, y); 
    A obj7 = { y, y }; 
    int var = function(obj1, obj2, obj3, obj4, obj5, obj6, obj7); 

    return 0; 
} 

सी ++ 11 स्टैंडर्ड (आईएसओ/आईईसी 14882: 2011) में, धारा 3.9, अनुच्छेद 10 राज्यों (जोर मेरा):शाब्दिक प्रकार कक्षा सी ++ 11/सी ++ 14

एक प्रकार एक शाब्दिक प्रकार अगर यह है:

  • एक अदिश प्रकार; या
  • एक संदर्भ प्रकार; या
  • एक वर्ग प्रकार (धारा 9) निम्नलिखित गुण के सभी है:
    • यह एक छोटी सी नाशक है,
    • हर निर्माता कॉल और में पूर्ण अभिव्यक्ति ब्रेस या equal- शुरुआती गैर स्थैतिक डेटा सदस्यों (यदि कोई है) के लिए निरंतर अभिव्यक्ति (5.1 9),
    • यह एक समग्र प्रकार (8.5.1) है या कम से कम एक constexpr कन्स्ट्रक्टर या कन्स्ट्रक्टर टेम्पलेट है जो प्रतिलिपि नहीं है या कन्स्ट्रक्टर ले जाएं, और
    • सभी गैर स्थैतिक डेटा सदस्य और शाब्दिक प्रकार के आधार वर्ग हैं; या
  • शाब्दिक प्रकार की एक सरणी।

मेरी राय में, खाते में बोल्ड में गोली लेने, class A सी ++ 11 क्योंकि वहाँ निर्माता कॉल कर रहे हैं में एक शाब्दिक प्रकार और एक ब्रेस या बराबर-initializers गैर स्थैतिक डेटा के लिए नहीं है वे सदस्य जो निरंतर अभिव्यक्ति नहीं हैं। मैंने कन्स्ट्रक्टर परिभाषा से पहले constexpr डालने की कोशिश की और कन्स्ट्रक्टर को constexpr वैरिएबल को असाइन करने के लिए यह भी जांचने के लिए कि वास्तव में संकलक शिकायत करता है क्योंकि वे निरंतर अभिव्यक्ति नहीं हैं। हालांकि, क्लेंग और जीसीसी दोनों इसे सफलतापूर्वक संकलित करते हैं। तो मैं शायद गलत हूँ।

  • क्या कोई जानता है कि class A एक शाब्दिक प्रकार क्यों है?

गोली बोल्ड में में हटा दिया गया था सी ++ 14 (N3652), इसलिए मैं समझता हूँ class A सी ++ 14 में एक शाब्दिक प्रकार है। मुझे पता होना चाहिए क्योंकि functionconstexpr है, इसलिए each of its parameter types shall be a literal type (सी ++ 11/सी ++ 14 मानक, धारा 7.1.15, अनुच्छेद 3)।

संपादित करें: मूल पोस्ट में मैंने इसे पढ़ने में आसान बनाने के लिए एक सरल उदाहरण का उपयोग किया, और समझाया कि मैंने पहले से ही कई संयोजनों की कोशिश की है। अब मैंने उन संयोजनों में से कुछ के साथ उदाहरण अपडेट किया है, यह दिखाने के लिए कि मैंने विभिन्न कन्स्ट्रक्टर कॉल, परिभाषाएं और गैर स्थैतिक डेटा सदस्य प्रारंभिकताओं की कोशिश की है। धन्यवाद।

+0

"* क्या किसी को पता है कि कक्षा ए एक शाब्दिक प्रकार क्यों है? *" यह सी ++ 11 में नहीं है। और आपके द्वारा दिखाए गए कोड में से कोई भी * एक शाब्दिक प्रकार होने की आवश्यकता नहीं है। तो समस्या क्या है? –

+0

क्या आप जानते हैं कि * ब्रेस-या-बराबर-प्रारंभकर्ता * क्या है? –

+0

@ टी.सी. मुझे लगता है * ब्रेस-या-बराबर प्रारंभकर्ता * यह 'int x {y} 'या यह' int x = y' है। मैं आमतौर पर * ए (int z): मान (x) {} 'में 'मान' प्रारंभ करते समय कन्स्ट्रक्टर में प्रारंभिकताओं के लिए * सदस्य-प्रारंभकर्ता-सूची * कहता हूं, लेकिन मैंने इसे बहुत से लोगों को भी संदर्भित किया है * ब्रेस-या-बराबर प्रारंभिक *। अगर मैंने कोई गलती की तो कृपया मुझे सही करें। किसी भी मामले में, मैंने ऑब्जेक्ट के लिए और कन्स्ट्रक्टर में चर 'वैल्यू' के लिए ब्रेसिज़, बराबर इत्यादि के कई संयोजनों की कोशिश की, और नतीजा वही है। धन्यवाद। –

उत्तर

3

क्या किसी को पता है कि कक्षा A एक शाब्दिक प्रकार क्यों है?

यह सी ++ 11 में नहीं है, लेकिन यह आपके पोस्ट में उद्धृत कारणों के कारण सी ++ 14 में है। हालांकि ...

हालांकि, क्लैंग और जीसीसी दोनों इसे सफलतापूर्वक संकलित करते हैं। तो मैं शायद गलत हूँ।

आप गलत नहीं हैं। न तो क्लैंग और जीसीसी हैं। कोड वास्तव में अच्छी तरह से गठित है, A शाब्दिक प्रकार नहीं है ... बस क्योंकि कुछ भी इसे शाब्दिक प्रकार की आवश्यकता नहीं है। functionconstexpr फ़ंक्शन हो सकता है, लेकिन इसे निरंतर अभिव्यक्ति के रूप में नहीं बुलाया जा रहा है। varconstexpr ऑब्जेक्ट नहीं है, इसलिए कोई भी लागू आवश्यकता नहीं है कि सभी ऑब्जेक्ट्स शाब्दिक प्रकार के हों। आप की कोशिश की थी:

constexpr int var = function(...); 

तो कोड हैं बीमार का गठन किया जा, इस मामले में के रूप में, function(...) एक कोर निरंतर अभिव्यक्ति है, जो शाब्दिक प्रकार की आवश्यकता है, जो एक आवश्यकता है की आवश्यकता होगी कि में सी + +11 A असफल रहा। (असल में, आपको सी ++ 14 में समस्या भी होगी कि A एस में से कोई भी constexpr ऑब्जेक्ट्स नहीं है)।

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