2012-06-06 10 views
5
struct POD { int i, j; };  
class A { 
    POD m_pod; 
public: 
    A() : m_pod({1,2}) {} // error 
    A() : m_pod(static_cast<POD>({1,2})) {} // error 
    A() : m_pod((POD) {1,2}) {} // ok! 
}; 

मैं इसे g++34 के साथ संकलित पुराने उत्पादन कोड में देखता हूं, तब तक मुझे यह सुविधा नहीं पता।
क्या यह g++ विशिष्ट सुविधा है? यदि नहीं, तो टाइपकास्टिंग की आवश्यकता क्यों है और यह भी सी-स्टाइल कास्ट की अनुमति है?प्रारंभकर्ता सूची में पीओडी डेटा शुरू करते समय सी-स्टाइल टाइपकास्टिंग अनिवार्य क्यों है?

+0

मेरा अनुमान है '{1,2}' नहीं एक पॉड प्रकार है और एक 'reinterpret_cast' हो रहा है। –

उत्तर

4

आपके द्वारा उपयोग किए जाने वाले वाक्यविन्यास केवल प्रारंभकर्ता सूचियों के लिए नहीं है, यह उनकी घोषणाओं के बाहर कक्षा प्रकारों के किसी भी प्रारंभिकरण के लिए है। उदाहरण के लिए:

POD p; 
p = (POD) {1, 2}; 

ये यौगिक शाब्दिक कहा जाता है, उन्हें सी 99 में सी में जोड़ा गया था। वे वास्तव में सी ++ में समर्थित नहीं हैं; जीसीसी उन्हें सी ++ (और सी 8 9) में extension के रूप में अनुमति देता है। सी ++ 11 adds the syntax:

p = POD({1, 2}); 

या आपके मामले में:

A() : m_pod(POD({1,2})) {} 
+0

मुझे यह भी नहीं पता था कि जीसीसी 'पीओडी पी की अनुमति देता है; पी = (पीओडी) {1, 2}; 'वाक्यविन्यास। सभी जवाब अच्छे हैं; एक्सटेंशन के बारे में उपयोग जानकारी के लिए इसे स्वीकार करना। – iammilind

6

असल में निम्नलिखित वाक्य रचना सी ++ स्टैंडर्ड द्वारा अनुमति नहीं है (दोनों सी ++ 03, और सी ++ 11):

A() : m_pod((POD) {1,2}) {} // ok! 

के बाद से जीसीसी इस संकलित है, यह एक जीसीसी विस्तार है।

pod.cpp:: 8: 29: चेतावनी: आईएसओ सी ++ मनाही यौगिक-शाब्दिक


सी में

आप -pedantic विकल्प के साथ यह संकलन है, यह इस चेतावनी देता है ++ 11, तो आप इस लिख सकते हैं:

A() : m_pod{1,2} {} 

डेमो: http://ideone.com/XaO4y

या बस इस:

class A { 
    POD m_pod {1,2}; //in-place initialization 
public: 
    A() {} 
}; 

Ideone हालांकि इस का समर्थन नहीं करता।

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