मैं जानता हूँ कि यह एक तार के साथ एक char
शाब्दिक शृंखला आरंभ करने के लिए पूरी तरह से संभव है:क्या सशर्त रूप से चयनित स्ट्रिंग अक्षर के साथ एक वर्ण सरणी शुरू करना संभव है?
char arr[] = "foo";
सी ++ 11 8.5.2/1 इसलिए कहते हैं:
एक
char
सरणी (चाहे सादेchar
,signed char
, याunsigned char
),char16_t
सरणी,char32_t
सरणी, याwchar_t
शाब्दिक शृंखला एक संकीर्ण चरित्र,char16_t
स्ट्रिंग शाब्दिक, 0,123,053 से प्रारंभ किया जा सकता हैस्ट्रिंग शाब्दिक, या चौड़े स्ट्रिंग अक्षरशः, या ब्रेसिज़ में संलग्न एक उचित टाइप टाइपिंग स्ट्रिंग द्वारा। स्ट्रिंग अक्षर के मान के लगातार वर्ण सरणी के तत्वों को प्रारंभ करते हैं। ...
हालांकि, अगर आप एक सशर्त अभिव्यक्ति में दो स्ट्रिंग शाब्दिक साथ भी ऐसा ही कर सकते हैं? इस तरह उदाहरण के लिए:
char arr[] = MY_BOOLEAN_MACRO() ? "foo" : "bar";
(कहाँ MY_BOOLEAN_MACRO()
एक 1
या 0
तक विस्तारित है)। ...
1 पहली अभिव्यक्ति प्रासंगिक रूप
bool
(खंड 4) में बदल जाती है:सी ++ 11 5.16 (सशर्त ऑपरेटर) के प्रासंगिक भागों इस प्रकार हैं। इसका मूल्यांकन किया गया है और यदि यह
true
है, तो सशर्त अभिव्यक्ति का परिणाम दूसरी अभिव्यक्ति का मूल्य है, अन्यथा तीसरी अभिव्यक्ति का। ...4 यदि दूसरा और तीसरा ऑपरेंड एक ही मूल्य श्रेणी के glvalues हैं और एक ही प्रकार है, तो परिणाम उस प्रकार और मूल्य श्रेणी का है और यह दूसरा या तीसरा है तो यह थोड़ा सा क्षेत्र है ऑपरेंड एक बिट-फील्ड है, या यदि दोनों बिट-फ़ील्ड हैं।
ध्यान दें कि शाब्दिक एक ही लंबाई के हैं और इस प्रकार वे const char[4]
प्रकार के दोनों प्रकार हैं।
GCC one ideone निर्माण स्वीकार करता है। लेकिन मानक पढ़ने से, मुझे यकीन नहीं है कि यह कानूनी है या नहीं। क्या किसी के पास बेहतर अंतर्दृष्टि है?
सहमत, 8.5.2/1 बहुत स्पष्ट लगता है कि यह * स्ट्रिंग शाब्दिक * है और नहीं * कुछ अभिव्यक्ति जो एक स्ट्रिंग शाब्दिक * का मूल्यांकन करती है। (भले ही आप इस मामले में एक स्ट्रिंग अक्षर के मूल्यांकन के रूप में टर्नरी ऑपरेटर पर विचार करें)। –