2016-10-31 17 views
9

cppreference के अनुसार, stt :: is_literal_type को अस्वीकार किया गया है, std::is_literal_type विशेषता C++ 17 में बहिष्कृत है। प्रश्न क्यों और भविष्य में पसंदीदा प्रतिस्थापन क्या है यह जांचने के लिए कि कोई प्रकार literal type है या नहीं।सी ++ 17

उत्तर

13

As stated in P0174:

is_literal प्रकार विशेषता, सामान्य कोड को नगण्य मूल्य प्रदान करता है के रूप में क्या वास्तव में जरूरत है पता चला है कि एक विशिष्ट निर्माण निरंतर आरंभीकरण का उत्पादन की क्षमता है। शाब्दिक प्रकार की मूल अवधि कम से कम एक कॉन्स्टेक्सर कन्स्ट्रक्टर होने के लिए अर्थपूर्ण रूप से उपयोग करने के लिए बहुत कमजोर है।

असल में, क्या यह कह रहा है कि वहाँ कोई कोड आप is_literal_type_v साथ रक्षा और कहा कि यह सुनिश्चित करें कि अपने कोड वास्तव में constexpr है पर्याप्त होना हो सकता है कर रही है। यह पर्याप्त नहीं है:

template<typename T> 
std::enable_if_t<std::is_literal_type_v<T>, void> SomeFunc() 
{ 
    constexpr T t{}; 
} 

कोई गारंटी नहीं है कि यह कानूनी है। भले ही आप इसे is_default_constructible<T> से सुरक्षित रखें, इसका मतलब यह नहीं है कि यह constexpr डिफ़ॉल्ट रचनात्मक है।

आपको क्या चाहिए is_constexpr_constructible विशेषता है। जो अभी तक मौजूद नहीं है।

हालांकि, (पहले से लागू) विशेषता का कोई नुकसान नहीं होता है, और संकलन-समय आत्मनिरीक्षण की अनुमति देता है जिसके लिए कोर-भाषा प्रकार-श्रेणियां एक दिए गए टेम्पलेट पैरामीटर को संतुष्ट कर सकती हैं। जब तक कोर वर्किंग ग्रुप एक शाब्दिक प्रकार की धारणा को सेवानिवृत्त नहीं करता है, तब तक इसी लाइब्रेरी विशेषता को संरक्षित किया जाना चाहिए।

हटाने की दिशा में अगला कदम (बहिष्करण के बाद) एक प्रकार का पत्र लिखना होगा जो कि टाइप विशेषता को हटाकर/हटाते समय कोर भाषा से शब्द को निकालने का प्रस्ताव करेगा।

तो आखिरकार योजना "शाब्दिक प्रकारों" की पूरी परिभाषा से छुटकारा पाने के लिए है, इसे और अधिक सुगंधित जगह से बदलना।

+0

दिलचस्प बात यह है कि मैंने सोचा था कि 'std :: is_literal_type' एक सुरक्षित जांच प्रदान करता है कि किसी प्रकार का उपयोग कॉन्सएक्सप्र अभिव्यक्तियों में किया जा सकता है या नहीं। फिर भी यह एक अच्छा जवाब है। – plasmacel

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