लैम्ब्डा भाव unevaluated संदर्भों में अनुमति नहीं है (उदाहरण के लिए में decltype) और हाल ही में जब तक निरंतर भाव नहीं हो सकता। इसलिए टेम्पलेट तर्कों में उनका उपयोग करने का कोई तरीका नहीं था।का मूल्यांकन constexpr लैम्ब्डा गैर प्रकार टेम्पलेट तर्क में
सी ++ 17 में हालांकि निरंतर अभिव्यक्ति लैम्ब्डा संभव होगा। यह अभी भी सामान्य रूप से टेम्पलेट तर्कों में उनका उपयोग करने की अनुमति नहीं देता है।
हालांकि गैर प्रकार टेम्पलेट तर्क निरंतर अभिव्यक्ति लैम्ब्डा भाव एक से मूल्यांकन के संदर्भ में इस्तेमाल किया जा सकता, उदाहरण के लिए के लिए विशेष रूप:
template<int N> struct S { constexpr static int value = N; };
int main() {
int N = S<[]()constexpr{return 42;}()>::value;
}
कि अभी भी काम नहीं करता, क्योंकि लैम्ब्डा भाव स्पष्ट रूप से टेम्पलेट में अनुमति नहीं है तर्क या प्रकार या गैर प्रकार के तर्क।
मेरा प्रश्न उपरोक्त निर्माण की अनुमति नहीं देने के पीछे तर्क है। मैं समझ सकता हूं कि फ़ंक्शन हस्ताक्षर में लैम्ब्डा के प्रकार समस्याग्रस्त हो सकते हैं, लेकिन यहां बंद प्रकार स्वयं अप्रासंगिक है, केवल (संकलन-समय निरंतर) वापसी मान का उपयोग किया जाता है।
मुझे लगता है कारण यह है कि लैम्ब्डा शरीर में सभी बयानों टेम्पलेट तर्क अभिव्यक्ति का हिस्सा बनी और इसके परिणामस्वरूप SFINAE अगर शरीर में किसी भी बयान प्रतिस्थापन के दौरान बीमार बनाई है लागू किया जा करने की आवश्यकता होगी है। शायद कंपाइलर डेवलपर्स से महत्वपूर्ण काम की आवश्यकता होगी।
लेकिन वास्तव में यह मेरी प्रेरणा है। यदि उपर्युक्त निर्माण का उपयोग करना संभव था तो SFINAE न केवल निरंतर अभिव्यक्तियों के साथ प्रयोग किया जा सकता है, बल्कि अन्य बयान भी कॉन्सएक्स फ़ंक्शन (जैसे शाब्दिक प्रकार की घोषणाओं) में मान्य किया जा सकता है।
संकलक लेखकों पर प्रभाव के अलावा, कोई समस्या इस का कारण होता है, उदाहरण के लिए है मानक में अस्पष्टता, विरोधाभास या जटिलताओं?
मुझे लगता है कि आप अपने खुद के सवाल का जवाब दे। – Barry
खैर, +1 @ बैरी और यह वास्तव में एक दिलचस्प क्यू/ए है। – skypjack
@ बररी मैंने थोड़ा सा प्रश्न मेरे प्रश्न को संशोधित किया। मुझे कुछ मान्यताओं की उम्मीद थी कि यह वास्तव में (केवल) प्रमुख कारण है, शायद तर्क का जिक्र करते हुए एक समिति पेपर/चर्चा का कुछ संदर्भ। – user4407569