और 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 के बयान गलत समझ रहा हूँ?
यह मूल रूप से मानक से एक उद्धरण है (कुछ शब्दों को बदलकर)। साथ ही, यह "तत्काल संदर्भ" का अर्थ नहीं है। –
@ टी.सी. मुझे नहीं पता कि मानक "तत्काल संदर्भ" का अर्थ मानक में क्या है, लेकिन यह मुझे आश्चर्यचकित करता है कि 'is_constructible' का नतीजा आपको इस बारे में कुछ भी नहीं बताता है कि वस्तु * कोड की अगली पंक्ति * में बनाई जा सकती है या नहीं। –
विकल्प यह है कि एक ही प्रकार ('is_constructible') * के पास विभिन्न आधार वर्ग * हैं जहां इसका उपयोग किया जाता है। –