2013-02-05 60 views
13

जब मैं MSVC++ साथ निम्नलिखित कोड संकलन, मैं कोई त्रुटि मिलती है:खाका समारोह प्रकार कटौती और ऑपरेटर << C++

struct A 
{ 
    template<typename T> 
    void operator<<(T&& x) 
    { 
    } 

}; 
void f() 
{ 
} 
int main() 
{ 
    A().operator<<(f); // ok 
    A() << f;    // error 

    return 0; 
} 

जी ++ और बजना दोनों इस कोड को ठीक संकलन। AFAIK, 'ठीक' और 'त्रुटि' लाइनों बिल्कुल वही बात करते हैं, और टी टाइप शून्य (&)() को निष्कर्ष निकाला है। या यह शून्य() और फ़ंक्शन के रावल संदर्भों की अनुमति है? यदि हां, तो उनका क्या अर्थ है? क्या इस तरह के संदर्भ से कार्यों को पार करना ठीक है? क्या यह एमएसवीसी ++ बग है कि यह 'त्रुटि' संकलन को संकलित करने में विफल रहता है? बीटीडब्ल्यू, त्रुटि आउटपुट:

no operator found which takes a right-hand operand of type 'overloaded-function' (or there is no acceptable conversion) 
could be 'void A::operator <<<void(void)>(T (__cdecl &&))' 
with[ T=void (void) ] 
+1

आप अपनी C++ संकलक के संस्करण प्रदान कर सकते हैं? – xis

+0

एनएसवी सीटीपी अपडेट के साथ एमएसवीसी ++ 2012, जीसीसी 4.5.3 और 4.7.2 परीक्षण, क्लैंग 3.0 और 3.1 परीक्षण। – dsi

+0

मेरे पास वीसी 11 नहीं है, इसलिए मेरे लिए जांच करना मुश्किल है, लेकिन यह यूआरफ गिरने के साथ एक बग की तरह गंध करता है। कंपाइलर गलती से इसे आरआरएफ के रूप में व्याख्या करने के लिए व्याख्या करता है और इनपुट में एक लाभा स्वीकार नहीं करता है। यह जांचना दिलचस्प होगा कि 'typedef शून्य (* परीक्षण)(); परीक्षण जी() {वापसी एफ; } ... ए() << जी(); 'काम करेगा –

उत्तर

2

तो जैसा कि x() अंदर अतिभारित समारोह के साथ कहा जा सकता है अपने ही सवाल का जवाब:

प्रदान की कोड मान्य है और जब तक कार्यों के लिए rvalue संदर्भों की अनुमति दी (वे समान कार्य lvalue संदर्भों के लिए), यहां टेम्पलेट कटौती के दौरान टी शून्य हो जाना चाहिए (&)()।

एमएसवीसी में bug मेरे कोड को संकलित करने से रोकता है।

अद्यतन: बग विजुअल स्टूडियो 2013 संकलक में तय किया गया है

4

क्यों void operator<<(T&& x)? void operator<<(T& x) उद्देश्य प्रदान करता है।

समारोह, नीचे

struct A 
{ 
    template<typename T> 
    void operator<<(T& x) 
    { 
     x(); 
    } 

}; 
void f() 
{ 
} 

int main() 
{ 
    A().operator<<(f); 
    A() << f;    
    return 0; 
} 
+0

नहीं, मैं rvalue संदर्भ का उपयोग करता हूं ताकि अस्थायी _ कार्यक्षमता ऑब्जेक्ट्स को स्थानांतरित किया जा सके, कॉपी नहीं किया गया। _functions_ के लिए या तो वैसे ही काम करेगा। – dsi