विचित्र भाषा का मुद्दा CWG 1581 है :
खण्ड 15 [विशेष] पूरी तरह से स्पष्ट है कि विशेष सदस्य कार्य केवल स्पष्ट रूप से परिभाषित होते हैं जब वे ओड-उपयोग किए जाते हैं। यह अविकसित संदर्भों में निरंतर अभिव्यक्तियों के लिए एक समस्या पैदा करता है:
struct duration {
constexpr duration() {}
constexpr operator int() const { return 0; }
};
// duration d = duration(); // #1
int n = sizeof(short{duration(duration())});
यहां मुद्दा यह है कि हमें constexpr duration::duration(duration&&)
इस कार्यक्रम में स्पष्ट रूप से परिभाषित करने की अनुमति नहीं है , इसलिए इनिशियलज़र सूची में अभिव्यक्ति एक स्थिर अभिव्यक्ति नहीं है (क्योंकि यह एक कॉन्स्ट्रेक्स फ़ंक्शन को परिभाषित करता है जिसे परिभाषित नहीं किया गया है), इसलिए ब्रेडेड इनिशियलाइज़र में एक संकीर्ण रूपांतरण होता है , इसलिए कार्यक्रम बीमार है।
यदि हम लाइन # 1 को अनकंफर्ट करते हैं, तो मूव कंस्ट्रक्टर को स्पष्ट रूप से परिभाषित किया जाता है और प्रोग्राम मान्य होता है। दूरी पर यह डरावना कार्रवाई बेहद दुर्भाग्यपूर्ण है। कार्यान्वयन इस बिंदु पर विचलन करते हैं।
आप मुद्दे के बाकी विवरण पढ़ सकते हैं।
2017 में अल्बुकर्क में P0859 में इस मुद्दे के लिए एक संकल्प अपनाया गया था (C ++ 17 के बाद)। यह समस्या दोनों के लिए एक अवरोधक थी constexpr std::swap
( P0879 में हल किया गया ) और P1065constexpr std::invoke
में हल किया गया ( जिसमें CWG1581 उदाहरण भी हैं) दोनों, C ++ 20 के लिए दोनों के लिए एक अवरोधक थे ।
उदाहरण को समझने के लिए सबसे सरल, मेरी राय में, एलएलवीएम बग रिपोर्ट से कोड P1065 में बताया गया है:
template<typename T>
int f(T x)
{
return x.get();
}
template<typename T>
constexpr int g(T x)
{
return x.get();
}
int main() {
// O.K. The body of `f' is not required.
decltype(f(0)) a;
// Seems to instantiate the body of `g'
// and results in an error.
decltype(g(0)) b;
return 0;
}
CWG1581 सभी के बारे में है जब कॉन्स्टैक्स सदस्य के कार्य परिभाषित किए गए हैं, और संकल्प यह सुनिश्चित करता है कि वे केवल तब ही परिभाषित किए जाते हैं जब उपयोग किया जाता है। P0859 के बाद, ऊपर अच्छी तरह से गठित (प्रकार b
है int
)।
के बाद से std::swap
और std::invoke
दोनों सदस्य कार्यों के लिए जाँच (पूर्व में कदम निर्माण / असाइनमेंट और कॉल ऑपरेटर / बाद में किराए की कॉल), वे दोनों इस मुद्दे के समाधान पर निर्भर पर भरोसा करने के लिए है।