2012-11-04 9 views
8
void f(int count, ...){ 
    //whatever 
} 

struct somestruct{ 
    size_t a, b, c; 
}; 

int main() { 
    somestruct s; 
    f(1, s); //what is actually passed? 
} 

क्या पूरे struct कॉपी और स्टैक पर पारित किया गया है? यदि ऐसा है तो कॉपी कन्स्ट्रक्टर कहा जाता है? क्या सूचक पास हो गया है? क्या यह सुरक्षित है?क्या होता है यदि मैं एक vararg समारोह में एक संरचना पास?

+0

आपको सी ++ के बारे में पूछना चाहिए; सी में कॉपी कन्स्ट्रक्टर नहीं हैं। –

उत्तर

2

हाँ, यदि आप एक lvalue गुजरती हैं, rvalue रूपांतरण के लिए lvalue किया जाएगा, एक में वस्तु को कॉपी करने के प्रति निर्माता बुला जिसका अर्थ है नई प्रतिलिपि और एक तर्क के रूप में गुजर रहा है।

+0

अच्छा ... लेकिन अगर आपको अभी भी बाधा है कि प्रकार को तुलनीय रूप से कॉपी करने योग्य होना चाहिए (और आप करते हैं, तो 'g ++ 'अन्यथा त्रुटि उत्पन्न करता है), तो आपका उत्तर और बिलज़ समतुल्य हैं ... या नहीं? –

+0

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

1

void f(...) बिट-वाइज्ड प्रति का उपयोग कर रहा है। आपके somestruct के लिए कोई डिफ़ॉल्ट कन्स्ट्रक्टर या कॉपी कन्स्ट्रक्टर नहीं बनाया जाएगा क्योंकि इसमें केवल C++ बिल्ड-इन प्रकार हैं।

Is this safe? 

हां, यह पूरी तरह से सुरक्षित है।

मैं तुम्हें करने के लिए 'अंदर सी ++ ऑब्जेक्ट मॉडल' पर गौर करेंगे chapter 2 The Semantics of Constructors

+0

क्या आपके पास कुछ संदर्भ है? –

+0

मैंने अब देखा है कि संरचना को तुलनीय रूप से कॉपी करने योग्य होना चाहिए। –

+0

@LorenzoPistone: संरचना को पीओडी प्रकार होना चाहिए। –

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