2015-12-02 4 views
10

सी ++ 17 में Callable अवधारणा होगी और मैं सोच रहा था कि std::is_function<T>::valuetrue के साथ वास्तव में क्या अंतर था। क्या वे बराबर हैं? क्या एक दूसरे का सुपरसैट है?कॉल करने योग्य अवधारणा और std :: is_function प्रकार लक्षणों के बीच क्या अंतर है?

+4

अच्छी तरह से, अधिभारित 'ऑपरेटर()' वाला ऑब्जेक्ट कॉल करने योग्य है, लेकिन फ़ंक्शन –

+0

@ एमएम मुझे लगता है कि समस्या नाम के साथ निहित है। कार्य * कॉल करने योग्य हैं, लेकिन फ़ंक्शन ऑब्जेक्ट्स भी हैं। यह बहुत बुरा है कि कोई बेहतर नाम नहीं है ...? – VermillionAzure

उत्तर

13

सी ++ 17 एक Callable अवधारणा

यह सी ++ 11 के बाद से मानक में नहीं है होगा।

क्या वे समकक्ष हैं? क्या एक दूसरे का सुपरसैट है?

नहीं, वास्तव में, वे पूरी तरह से विवादित हैं। Callable केवल ऑब्जेक्ट प्रकारों पर लागू होता है, और पॉइंटर-टू-सदस्यों से सभी प्रकारों को ओवरलोडेड operator() प्रकारों में फ़ंक्शन पॉइंटर्स के फ़ंक्शन पॉइंटर्स में अंतर्निहित रूपांतरण के साथ टाइप करने के लिए टाइप करता है।

is_function केवल वास्तविक कार्य प्रकारों के लिए सत्य है, जो परिभाषा के अनुसार, ऑब्जेक्ट प्रकार नहीं हैं।

+1

क्या 'कॉल करने योग्य' कार्यों पर भी लागू नहीं होता है? –

+0

@NeilKirk नहीं, मानक द्वारा नहीं। [\ [Func.wrap.func \]/2] देखें (http://eel.is/c++draft/func.wrap.func#2) ("टाइप एफ का एक कॉल करने योग्य ऑब्जेक्ट f कॉल करने योग्य है ... "), [\ [func.def \]/3-4] (http://eel.is/c++draft/function.objects#func.def-3) (" एक कॉल करने योग्य प्रकार फ़ंक्शन ऑब्जेक्ट प्रकार है या सदस्य के लिए एक सूचक। एक कॉल करने योग्य वस्तु एक कॉल करने योग्य प्रकार का एक वस्तु है। "), और [\ [function.objects \]/1] (http://eel.is/c++draft/function.objects# 1) ("एक फ़ंक्शन ऑब्जेक्ट प्रकार एक ऑब्जेक्ट प्रकार है जो फ़ंक्शन कॉल में पोस्टफिक्स-अभिव्यक्ति का प्रकार हो सकता है।") –

+2

एलडब्ल्यूजी [यहां शब्द को समायोजित करने की संभावना है] (http://wg21.link/lwg2393), लेकिन इस तरह से इस तरह से प्रभावित नहीं होता है (शायद 'कॉल करने योग्य' को 'Lvalue-Callable'' नाम देने के अलावा)। –

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