2017-12-02 65 views
9

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 

सवाल यह है कि, कौन सही है?

+1

constexpr स्थानीय चर का उपयोग कर एक सरल उदाहरण मौजूद होना चाहिए, नहीं? – Yakk

+0

@Yakk, किया; यह मूल कोड के बराबर पूरी तरह से बराबर नहीं है ... या नहीं? –

+0

मैं यह सोचने में मदद नहीं कर सकता कि आप वास्तव में क्या करने की कोशिश कर रहे हैं और इसकी आवश्यकता क्यों है। –

उत्तर

3

यह एक जीसीसी बग है, 83258 दायर किया गया है।

सी ++ 14 में, हमारे पास पॉइंटर प्रकार के गैर-प्रकार टेम्पलेट पैरामीटर के लिए linkage requirement होता था। लेकिन सी ++ 17 में (N4268 के परिणामस्वरूप), पैरामीटर को सही प्रकार के converted constant expression होने की आवश्यकता है, कुछ अन्य प्रतिबंधों (जिनमें से कोई भी यहां प्रासंगिक नहीं है) के साथ। एक बार हम fp बना सकते हैं, तो हम इसे टेम्पलेट पैरामीटर के रूप में उपयोग करने में सक्षम होना चाहिए।

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

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