2009-10-05 15 views
6

बूस्ट लाइब्रेरी, और ऐसा लगता है कि आगामी सी ++ 0x मानक, विभिन्न प्रकार के गुण टेम्पलेट्स को परिभाषित करता है, जो छोटे कन्स्ट्रक्टर, प्रतिलिपि बनाने वाले, असाइनमेंट या विनाशकों के बीच अंतर करने के लिए परिभाषित करते हैं, जो कि ' टी। इसका सबसे महत्वपूर्ण उपयोग कुछ प्रकारों के लिए एल्गोरिदम अनुकूलित करना है, उदा। memcpy का उपयोग करके।सी ++: has_trivial_X प्रकार के लक्षण

लेकिन, मैं सभी विभिन्न has_trivial_X टेम्पलेट्स के बीच वास्तविक व्यावहारिक अंतर को समझ नहीं पा रहा हूं। सी ++ मानक केवल दो व्यापक श्रेणियों को परिभाषित करता है जो हमें यहां चिंता करते हैं: पीओडी और गैर-पीओडी। एक प्रकार गैर-पीओडी है यदि इसमें एक परिभाषित कन्स्ट्रक्टर है, प्रतिलिपि निर्माता, असाइनमेंट ऑपरेटर, या विनाशक है। दूसरे शब्दों में, कुछ भी जो अंतर्निहित प्रकार नहीं है, या अंतर्निहित प्रकारों की सी-स्ट्रक्चर, पीओडी नहीं है।

तो उदाहरण के लिए अलग-अलग होने का क्या मतलब है, उदाहरण के लिए, है_ट्रिविअल_एसिन और है_ट्रिविअल_कॉनस्ट्रक्टर? यदि किसी ऑब्जेक्ट में एक गैर-तुच्छ असाइनमेंट ऑपरेटर या गैर-तुच्छ कन्स्ट्रक्टर होता है तो यह एक पीओडी नहीं है। तो किस परिस्थिति में यह जानना उपयोगी होगा कि किसी ऑब्जेक्ट में एक छोटा असाइनमेंट ऑपरेटर है, लेकिन एक गैर-तुच्छ कन्स्ट्रक्टर है?

दूसरे शब्दों में, एक प्रकार के लक्षण टेम्पलेट को परिभाषित क्यों न करें, is_pod<T>, और इसके साथ किया जाए?

उत्तर

6

पीओडी प्रकार की परिभाषा सी ++ 0 ए में आराम से मिली।

एक प्रकार में एक गैर-तुच्छ-कन्स्ट्रक्टर हो सकता है, लेकिन इसमें एक छोटा असाइनमेंट ऑपरेटर हो सकता है।

उदा।

struct X 
{ 
    X() : y(-1) {} 
    X(int k, int v) : y(k * v) {} 

    int y; 
}; 

एक्स 'memcopy''ied' हो सकता है, लेकिन मामूली रूप से निर्मित नहीं किया जा सकता है।

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