क्या फ़ंक्शन ऑब्जेक्ट ओवरलोड रिज़ॉल्यूशन के दौरान नियमित कार्यों से अलग तरीके से व्यवहार किए जाते हैं? यदि हां, तो कैसे?फ़ंक्शन ऑब्जेक्ट्स ओवरलोड रिज़ॉल्यूशन को कैसे प्रभावित करते हैं?
#include <iostream>
namespace N
{
enum E { A, B };
void bar(E mode) { std::cout << "N::bar\n"; }
}
template <typename... Args>
void bar(Args&&... args) { std::cout << "global bar\n"; }
int main()
{
bar(N::A);
}
यहाँ उत्पादन "N :: बार" है:
मैं जहां एक समतुल्य रूप-प्रतिदेय समारोह वस्तु के साथ एक समारोह की जगह निम्नलिखित मामले में चलाने की है कोड के अर्थ बदल दिया है। अब तक, बहुत अच्छा: एन :: बार एडीएल द्वारा पाया जा रहा है, एन :: बार और वैश्विक बार दोनों सटीक मिलान हैं, और एन :: बार को प्राथमिकता दी जाती है क्योंकि यह टेम्पलेट नहीं है।
लेकिन अगर मैं वैश्विक बार बदलें ताकि तरह, एक समारोह वस्तु होने के लिए:
#include <iostream>
namespace N
{
enum E { A, B };
void bar(E mode) { std::cout << "N::bar\n"; }
}
struct S
{
template <typename... Args>
void operator()(Args&&... args) { std::cout << "global bar\n"; }
};
S bar;
int main()
{
bar(N::A);
}
उत्पादन अब "वैश्विक बार" है। अंतर क्यों?
आज मैंने सीखा, डेविड धन्यवाद। – ildjarn
मुझे लगता है कि 3.4 पर नोट नहीं है।1/3 प्रासंगिक है, क्योंकि 'बार' * * फ़ंक्शन कॉल अभिव्यक्ति में पोस्टफिक्स-अभिव्यक्ति है (ऑपरेशन के रूप में कोई फ़ंक्शन नहीं है, लेकिन अंततः एक को कॉल कर रहा है!)। नोट में कहा गया है कि 3.4.2 "x (y)" के सिंटैक्टिक अर्थ को नहीं बदलता है - यदि यह एक फ़ंक्शन कॉल है, तो यह 3.4.2 का निर्णय लेने के लिए फ़ंक्शन कॉल को अनदेखा करता है। –
@ जोहान्सचैब-लिटब: नियमित लुकअप मिलेगा कि 'बार' एक ऑब्जेक्ट है, और ऑब्जेक्ट' बार (x) 'होने के कारण उस ऑपरेटर को' ऑपरेटर() 'के अनुप्रयोग का प्रतिनिधित्व करता है। जबकि ऑपरेटर का आवेदन एक फंक्शन कॉल है, यह एक * सदस्य-फ़ंक्शन * कॉल है, और इस प्रकार एडीएल लागू नहीं होता है। –