2016-09-12 10 views
7

और std::is_destructible का मूल्यांकन करते समय क्लैंग और जीसीसी friend घोषणाओं का सम्मान नहीं करते हैं।is_constructible और is_destructible दोस्त घोषणाओं से अप्रभावित

`बारे is_constructible, cppreference.com says:

पहुँच चेकों के रूप में एक संदर्भ टी और आर्ग में प्रकारों में से किसी के साथ कोई संबंध से अगर प्रदर्शन कर रहे हैं। परिवर्तनीय परिभाषा के तत्काल संदर्भ की केवल वैधता माना जाता है।

(साइट कैसे पहुँच चेक के is_destructible सौदों, लेकिन पहुँच संशोधक करना सामान्य रूप में is_destructible के व्यवहार को प्रभावित की व्याख्या नहीं करता, तो मैं यह is_constructible के रूप में एक ही तरह से काम करने की उम्मीद होगी।)

इसलिए, मुझे लगता है कि इस कोड चाहिए नहीं संकलन, के बाद से जांच की तत्काल संदर्भ में निर्माता और नाशक हैं उपलब्ध, स्थानीय चर इन्स्टेन्शियशन इसका सबूत के रूप में:

class Private 
{ 
    Private() {} 
    ~Private() {} 

    friend class Friend; 
}; 

class Friend 
{ 
    public: 
     Friend() 
     { 
      // Both of these should fire, but they do not. 
      static_assert(
       !std::is_constructible<Private>::value, 
       "the constructor is public"); 
      static_assert(
       !std::is_destructible<Private>::value, 
       "the destructor is public"); 
      // There is no error here. 
      Private p; 
     } 
}; 

... लेकिन Coliru compiles it without error (या तो जीसीसी या क्लैंग का उपयोग करके)।

यह यह एक बग (या कम से कम एक अवज्ञा) में दोनों compilers है, या cppreference.com मानक गलत ढंग से प्रस्तुत किया गया है, या मैं cppreference.com के बयान गलत समझ रहा हूँ?

+0

यह मूल रूप से मानक से एक उद्धरण है (कुछ शब्दों को बदलकर)। साथ ही, यह "तत्काल संदर्भ" का अर्थ नहीं है। –

+0

@ टी.सी. मुझे नहीं पता कि मानक "तत्काल संदर्भ" का अर्थ मानक में क्या है, लेकिन यह मुझे आश्चर्यचकित करता है कि 'is_constructible' का नतीजा आपको इस बारे में कुछ भी नहीं बताता है कि वस्तु * कोड की अगली पंक्ति * में बनाई जा सकती है या नहीं। –

+1

विकल्प यह है कि एक ही प्रकार ('is_constructible ') * के पास विभिन्न आधार वर्ग * हैं जहां इसका उपयोग किया जाता है। –

उत्तर

2

यह वास्तव में क्या

पहुँच चेकों के रूप में एक संदर्भ Args में T और प्रकारों में से किसी के साथ कोई संबंध से अगर प्रदर्शन कर रहे हैं है।

कहता है। "T का मित्र" परिभाषा द्वारा "T से संबंधित नहीं है"।

"immediate context" कला का एक शब्द है, लेकिन किसी भी घटना में वाक्य hypothetical चर परिभाषा के तत्काल संदर्भ के बारे में बात कर रहा है, is_constructible का उपयोग नहीं।

is_constructible को संदर्भ-निर्भर करने के लिए पागलपन होगा; इसका मतलब यह होगा कि एक ही प्रकार, is_constructible<T, Args...>, विभिन्न संदर्भों में विभिन्न आधार वर्ग हैं।

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