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 में एक शाब्दिक प्रकार है। मुझे पता होना चाहिए क्योंकि function
constexpr
है, इसलिए each of its parameter types shall be a literal type
(सी ++ 11/सी ++ 14 मानक, धारा 7.1.15, अनुच्छेद 3)।
संपादित करें: मूल पोस्ट में मैंने इसे पढ़ने में आसान बनाने के लिए एक सरल उदाहरण का उपयोग किया, और समझाया कि मैंने पहले से ही कई संयोजनों की कोशिश की है। अब मैंने उन संयोजनों में से कुछ के साथ उदाहरण अपडेट किया है, यह दिखाने के लिए कि मैंने विभिन्न कन्स्ट्रक्टर कॉल, परिभाषाएं और गैर स्थैतिक डेटा सदस्य प्रारंभिकताओं की कोशिश की है। धन्यवाद।
"* क्या किसी को पता है कि कक्षा ए एक शाब्दिक प्रकार क्यों है? *" यह सी ++ 11 में नहीं है। और आपके द्वारा दिखाए गए कोड में से कोई भी * एक शाब्दिक प्रकार होने की आवश्यकता नहीं है। तो समस्या क्या है? –
क्या आप जानते हैं कि * ब्रेस-या-बराबर-प्रारंभकर्ता * क्या है? –
@ टी.सी. मुझे लगता है * ब्रेस-या-बराबर प्रारंभकर्ता * यह 'int x {y} 'या यह' int x = y' है। मैं आमतौर पर * ए (int z): मान (x) {} 'में 'मान' प्रारंभ करते समय कन्स्ट्रक्टर में प्रारंभिकताओं के लिए * सदस्य-प्रारंभकर्ता-सूची * कहता हूं, लेकिन मैंने इसे बहुत से लोगों को भी संदर्भित किया है * ब्रेस-या-बराबर प्रारंभिक *। अगर मैंने कोई गलती की तो कृपया मुझे सही करें। किसी भी मामले में, मैंने ऑब्जेक्ट के लिए और कन्स्ट्रक्टर में चर 'वैल्यू' के लिए ब्रेसिज़, बराबर इत्यादि के कई संयोजनों की कोशिश की, और नतीजा वही है। धन्यवाद। –