2015-11-28 3 views
28

मैंने देखा कि छद्म विनाशक कॉल मान्य है जब टाइप-नाम का उपयोग किया जाता है लेकिन जब मौलिक प्रकार का उपयोग नहीं किया जाता है।क्या ऐसी भाषा संरचनाएं हैं जो टाइप-नाम के लिए मान्य हैं लेकिन मौलिक प्रकारों के लिए नहीं हैं?

typedef int BType; 
int b; 
b.~BType(); // Legal 
b.~int();  // Not legal 

के लिए ऊपर an answer to another SO post में पाया जा सकता एक व्याख्या।

की परिभाषा प्रकार- नाम, सी ++ 11 स्टैंडर्ड से:

7.1.6.2 सरल प्रकार विनिर्देशक, p1

 
type-name: 
    class-name 
    enum-name 
    typedef-name 
    simple-template-id 

वहाँ किसी भी अन्य भाषा हैं संरचनाएं मान्य होती हैं जब टाइप विनिर्देशक टाइप-नाम है लेकिन यह वैध नहीं है जब यह मौलिक प्रकार है जब टाइप-नाम ऊपर दिखाए गए अनुसार एक मौलिक प्रकार का प्रतिनिधित्व करता है?

+0

एक अस्थायी वस्तु अभिव्यक्ति संशोधित करना होगा: 'टी {}' मान्य है, लेकिन 'int [5] {}' नहीं है। (लेकिन 'पूर्णांक [5]' नहीं एक बुनियादी प्रकार है।) –

+0

अगर यह आपके मानकों में है मैं नहीं जानता, लेकिन आप एक इंटीरियर गुंजाइश या नाम स्थान में एक प्रकार के नाम को फिर से परिभाषित कर सकते हैं। '{टी = int;} का उपयोग करके 'ठीक /' {int = टी;} 'नहीं। – rici

+0

@rici, यह वह नहीं है जो मैं सोच रहा था। यहां, 'टी' परिभाषित किया जा रहा है। हम जानते हैं कि मौलिक प्रकारों को फिर से परिभाषित नहीं किया जा सकता है। मुझे अपना प्रश्न परिशोधित करने दें। –

उत्तर

4

मुझे नहीं लगता कि आपको कोई अन्य मामला मिल जाएगा। अगर हम मसौदा सी देखो ++ मानक अनुबंध A व्याकरण सारांश हम व्याकरण में ही अन्य स्थानों को देख सकते हैं, जहां प्रकार- नाम दिखाता हैं:

nested-name-specifier: 
    :: 
    type-name :: 
    namespace-name :: 
    decltype-specifier :: 
    nested-name-specifier identifier :: 
    nested-name-specifier templateopt simple-template-id :: 

और:

simple-type-specifier: 
    nested-name-specifieropt type-name 
    [...] 

इनमें से कोई भी ऐसा अवसर प्रदान नहीं करता है जिसे हम pseduo-destructor के साथ प्राप्त करते हैं जिसमें निम्नलिखित व्याकरण होता है:

pseudo-destructor-name: 
    nested-name-specifieropt type-name :: ~ type-name 
    nested-name-specifier template simple-template-id :: ~ type-name 
    nested-name-specifieropt~ type-name 
    ~ decltype-specifier 

और अनुभाग 5.2.4 [expr.pseudo] जो व्यवहार हम देखते हैं के लिए प्रदान करता है में कवर किया जाता है:

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

दूसरी ओर

हम खंड में नेस्टेड-नाम-विनिर्देशक के लिए नियमों को देख सकते हैं 3.4.3[basic.lookup.qual] तरह के एक मामले न करे:

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

सरल प्रकार-विनिर्देशक मामले हमें वहाँ नहीं मिलता है या तो के बाद से मौलिक प्रकार के होते हैं इस मामले के लिए पहले ही स्वीकार्य है।

2

वहाँ एक अंतर एक समारोह की वापसी प्रकार एक मौलिक प्रकार या नहीं है जब है:

struct X{}; 

template <class T> auto foo() { 
    // one liner 
    []() -> T { return T{}; }() = T{}; // invalid for T fundamental type 

    // or more clear: 
    auto get_t = []() -> T { return T{}; }; 
    get_t() = T{}; // invalid for T fundamental type 
} 

auto main() -> int { 
    foo<X>(); // valid 
    foo<int>(); // invalid 
    return 0; 
} 

टेम्पलेट्स के बिना, और भी अधिक स्पष्ट होना: मौलिक प्रकार के लिए

struct X{}; 

auto ret_x() -> X { return X{}; }  
auto ret_int() -> int { return int{}; } 


auto main() -> int { 
    ret_x() = X{};  // valid 
    ret_int() = int{}; // invalid 
    return 0; 
} 

rvalues ​​नहीं कर सकते संशोधित किया जाना चाहिए। यह स्पष्ट रूप से, अन्य प्रकार के लिए ऐसा नहीं है के रूप में, उदाहरण के लिए, एक कदम आपरेशन अस्थायी रूप से यह बढ़ता रहता है (उदाहरण के लिए मालिक सूचक nullptr बनाने)

+1

मुझे लगता है कि क्या ओ पी कहते हैं कि करने के लिए होती थी: * निर्माणों जब प्रकार निर्दिष्टकर्ता एक प्रकार-ऐसा नाम है जो एक मौलिक प्रकार * –

+1

@ShafikYaghmour है कि मान्य हैं। ।ओह मैं समझा। क्या मुझे जवाब हटा देना चाहिए? – bolov

+0

मुझे यकीन नहीं है, इस तरह मैं मूल रूप से इसे पढ़ता हूं लेकिन अब मैं देख सकता हूं कि आप इसे अलग तरीके से कैसे पढ़ते हैं। मुझे नहीं लगता कि सवाल इतना दिलचस्प है अगर ऐसा नहीं है। लेकिन ओपी को स्पष्ट करने की जरूरत है। अन्यथा हमारे पास * नेस्टेड-नाम-विनिर्देशक * का मामूली मामला है। –

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

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