How do I write a lambda expression that looks like a method? का जवाब देते हुए, मैंने इस तथ्य का शोषण करके एक कैप्चरलेस लैम्ब्डा को सदस्य फ़ंक्शन पॉइंटर में बदलने की कोशिश की, क्योंकि सी ++ 17 के बाद, कैप्चरलेस लैम्बडास में constexpr रूपांतरण ऑपरेटर उनके फ़ंक्शन पॉइंटर प्रकार पर है।क्या मैं एक सी ++ 17 कैप्चरलेस लैम्ब्डा कॉन्टेक्सप्रो रूपांतरण कनवर्टर के परिणाम का उपयोग फ़ंक्शन पॉइंटर टेम्पलेट गैर-प्रकार तर्क के रूप में कर सकता हूं?
तो मैं एक मुद्दा नीचे करने के लिए उबलते के साथ आया था:
template<void(*)()> struct A{};
int main()
{
A<static_cast<void(*)()>([]{})>{}; // 1
constexpr auto fp = static_cast<void(*)()>([]{});
A<fp>{}; // 2
}
अब, यह बजना में संकलित (5.0.0 के बाद से) लेकिन जीसीसी (> = 7.2) की शिकायत है:
error: lambda-expression in template-argument
A<static_cast<void(*)()>([]{ /*whatever*/ })>{}; // 1
^
error: 'main()::<lambda()>::_FUN' is not a valid template argument for type 'void (*)()' because 'static constexpr void main()::<lambda()>::_FUN()' has no linkage
A<fp>{}; // 2
सवाल यह है कि, कौन सही है?
constexpr स्थानीय चर का उपयोग कर एक सरल उदाहरण मौजूद होना चाहिए, नहीं? – Yakk
@Yakk, किया; यह मूल कोड के बराबर पूरी तरह से बराबर नहीं है ... या नहीं? –
मैं यह सोचने में मदद नहीं कर सकता कि आप वास्तव में क्या करने की कोशिश कर रहे हैं और इसकी आवश्यकता क्यों है। –