2012-05-30 24 views
12

निम्नलिखित निर्माण का क्या अर्थ है?सी ++ वैरैडिक टेम्पलेट असामान्य उदाहरण

#include <iostream> 

template <int ...> struct s; 

int main() { 
    int i = s<,>::xxx; 

    std::cout << i << std::endl; 
} 

यह जीसीसी द्वारा संकलित है 4.4.5+ और जब निष्पादित आउटपुट 0-S स्विच के साथ

template <int ...> struct s; 

int main() { 
    int i = s<,>::xxx; 

    return i; 
} 

और यह संकलित, विधानसभा उत्पादन कि मैं निम्नलिखित करने के लिए साफ पाने के लिए:

+0

यह मेरी मशीन पर कुछ यादृच्छिक मूल्य आउटपुट करता है। 'I' की शुरुआत किसी भी तरह से अनदेखा की जाती है और' i' का प्रारंभिक मान मुद्रित होता है। – jrok

+5

यह कानूनी नहीं दिखता है। 's' कभी परिभाषित नहीं किया गया है (और इसमें 'xxx' सदस्य नहीं है) और टेम्पलेट को खाली-खाली पैरामीटर दिए जाने चाहिए। (मैंने इसे जीसीसी 4.6.2 के साथ संकलित किया, और इसे '32767' मुद्रित किया गया, क्लैंग इसे संकलित नहीं करेगा)। – Mankarse

+0

's' या' xxx' के नाम बदलना व्यवहार को नहीं बदलता है। यह लगभग निश्चित रूप से जीसीसी में एक बग है। ऐसा लगता है कि बग एक भिन्न टेम्पलेट के लिए खाली तर्क की आपूर्ति करके ट्रिगर किया जाता है। – Mankarse

उत्तर

13

मैं यह करने के लिए कार्यक्रम दुबारा लिखा

main: 
     pushq %rbp 
     movq %rsp, %rbp 
     movl -4(%rbp), %eax 
     popq %rbp 
     ret 

अब, मेरी एएसएम थोड़ा सा जंगली है, लेकिन एकमात्र महत्वपूर्ण कोड movl -4(%rbp), %eax लगता है, जो i से जो कुछ भी पढ़ सकता है, उस पर वापसी मूल्य निर्धारित करता है। दूसरे शब्दों में, कार्यक्रम main फ़ंक्शन दर्ज किए जाने पर स्टैक के शीर्ष पर जो कुछ भी था, वह देता है। ऐसा लगता है कि @ jrok की टिप्पणी है कि i की शुरुआत किसी भी तरह से अनदेखा की जाती है। रहस्यमय s<,>::xxx-संपीड़न के लिए कोई कोड उत्पन्न नहीं हुआ है।

नीचे पंक्ति; यह एक कंपाइलर बग की तरह दिखता है। कंपाइलर को एक त्रुटि संदेश दिया जाना चाहिए था।

पुष्टि पक्ष नोट: मुझे प्रोग्राम int main() { int i; return i; } के लिए समान असेंबली आउटपुट मिलता है।

+0

अच्छी कटौती। :) – Dennis