2012-11-04 6 views
8

मैं जीसीसी और बजना के साथ इस कार्यक्रम की कोशिश की, लेकिन दोनों उत्पादन कुछ भी नहींतुच्छ प्रतिलिपि कन्स्ट्रक्टर के साथ एक क्लास ऑब्जेक्ट पास करना, लेकिन कोई आउटपुट नहीं?

#include <iostream> 

struct A { 
    A(){} 

    template<typename T> 
    A(T &) { 
    std::cout << "copied!"; 
    } 
}; 

void f(...) { } 

int main() { 
    A a; 
    f(a); 
} 

मेरी मानकों पढ़ने, इस कार्यक्रम होना चाहिए उत्पादन "copied!" के अनुसार। क्या कोई मुझे बता सकता है कि क्या मैं गलत हूं या क्या यह उन दो कंपाइलरों में एक बग है?

+2

यह "छोटी कॉपी कन्स्ट्रक्टर" नहीं है। –

+0

वीसी ++ कहते हैं कि इलिप्सिस पैरामीटर प्रतिलिपि बनाने वाले के बजाय बाइनरी प्रति में परिणाम देता है। http://msdn.microsoft.com/en-us/library/z11y6be4(v=vs.110).aspx – MaximR

+2

@ मैक्सिमआर जो एक टिप्पणी से अधिक उत्तर है। –

उत्तर

3

ऐसा लगता है कि आप अपेक्षा करते हैं कि मानक द्वारा परिभाषित व्यवहार क्या है।

टेम्पलेट फ़ंक्शन कॉपी कन्स्ट्रक्टर/असाइनमेंट ऑपरेटर के निर्माण को रोक नहीं देते हैं। इसलिए टेम्पलेट फ़ंक्शन किसी वर्ग को "तुच्छ रूप से कॉपी करने योग्य" मानने से नहीं रोकते हैं। हालांकि, वे ओवरलोड रिज़ॉल्यूशन में भाग लेते हैं जब वास्तव में उन्हें कॉपी करने का समय आता है, इसलिए वे हस्तक्षेप कर सकते हैं। और a इस उदाहरण में एक गैर-कॉन्स एल-वैल्यू है, यह से हस्ताक्षर A(A&) से बेहतर फिट बैठता है। तो यह टेम्पलेट समारोह कहते हैं।

(हालांकि क्यों आप अपने प्रश्न में यह सब समझाने के लिए परेशान नहीं किया था, मुझे eludes जब से तुम स्पष्ट रूप से अपने शोध किया।)

हालांकि

, एक कोने-मामला इस, मैं wouldn है की कितनी भी छोटी क्यों पर विचार इस व्यवहार पर भरोसा करने के लिए बारीकी से कॉपी करने योग्य वर्गों को मजबूती से कॉपी नहीं किया जा रहा है।

+3

यह गलत है। टेम्पलेट कन्स्ट्रक्टर एक कॉपी कन्स्ट्रक्टर नहीं है, इसे उसी वर्ग प्रकार के गैर-कॉन्स लैवल्यू को पारित करते समय इसे कॉल करने में बाधा नहीं डालती है। – Xeo

+2

@Xeo: नहीं, लेकिन अगर एक संश्लेषित [गैर-टेम्पलेट] कॉपी कन्स्ट्रक्टर भी अन्य हस्ताक्षर के साथ है, तो उसे ओवरलोड रिज़ॉल्यूशन में प्राथमिकता दी जाएगी। यह टेम्पलेट "कॉपी कन्स्ट्रक्टर" कभी भी तत्काल नहीं होगा! –

+0

@ लाइटनेस: लेकिन यह मामला यहां नहीं है, क्योंकि हमारे पास गैर-कॉन्स लैवल्यू तर्क और 'टी &' पैरामीटर है। – Xeo

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