2015-06-23 4 views
14

[namespace.memdef] में निम्नलिखित खंड/3 पर विचार करें:टेम्पलेट-आईडी से मित्र लुकअप अपवाद?

एक friend घोषणा में नाम योग्य है और न ही एक टेम्पलेट आईडी न है और घोषणा एक समारोह या एक elaborated- है टाइप-विनिर्देशक, यह निर्धारित करने के लिए कि क्या इकाई पहले घोषित की गई है, नाममात्र नामस्थान के बाहर किसी भी क्षेत्र पर विचार नहीं करेगा।

वहाँ योग्य नाम के साथ टेम्पलेट आईडी के लिए अपवाद के लिए एक कारण है? उस मामले के लिए, क्या एक अयोग्य नाम के लुकअप के लिए कोई कारण नहीं है जो टेम्पलेट-आईडी नहीं है जो आंतरिक संलग्न नामस्थान तक सीमित है? क्या कोई विशिष्ट समस्या या उपयोग-मामला है कि यह खंड हल हो जाता है?

+1

योग्यता-आईडी और टेम्पलेट-आईडी उस नामस्थान के नए सदस्यों को घोषित नहीं कर सकते हैं (आपने नोट छोड़ दिया है)। – dyp

+1

क्या आपने http://www.open-std.org/jtc1/sc22/wg21/docs/papers/1995/N0783.pdf पढ़ा है? – dyp

+0

@dyp नहीं, मैंने नहीं किया है, और आप यह सामान कैसे ढूंढते हैं? मुझे लगता है कि नोट और 1.1 के बीच, यह जवाब है। – Barry

उत्तर

5

योग्य नाम और टेम्पलेट-आईडी पर प्रतिबंध क्यों लागू नहीं होता है?

[नोट:: अन्य के रूपों

योग्य नाम और टेम्पलेट-आईडी संलग्नित नेम स्पेस में नए सदस्यों का परिचय नहीं कर सकते हैं, यह क्या [namespace.memdef] p3 में टिप्पणी का कहना है की कोशिश करता है friend घोषणाएं आंतरिक नामांकन नामस्थान के नए सदस्य घोषित नहीं कर सकती हैं और इस प्रकार सामान्य लुकअप नियमों का पालन करें। - अंत टिप्पणी]

इसलिए, इस तरह कोई प्रतिबंध योग्य नाम और टेम्पलेट-आईडी के लिए आवश्यक है।

ध्यान दें कि टेम्पलेट-आईडी में टेम्पलेट-पैरामीटर की घोषणा की कमी है, और योग्य-आईडी दूर-दूर, असंबंधित नामस्थानों में नाम पेश कर सकते हैं।


बिलकुल प्रतिबंध क्यों है?

उत्तर का यह हिस्सा अभी भी अपूर्ण है, लेकिन "शोध" की वर्तमान स्थिति का प्रतिनिधित्व करता है। योगदान करने के लिए स्वतंत्र महसूस करें।

प्रतिबंध (शायद?) N0783 - Namespace Issues and Proposed Resolutions के कारण पेश किया गया है जो "कई नामस्थान मुद्दों को स्पष्ट करने का प्रयास करता है जो वर्तमान में अपरिभाषित या अपूर्ण रूप से निर्दिष्ट हैं"।

1 99 5 से इस पत्र में मित्र-घोषणाओं के माध्यम से पेश की गई संस्थाओं की घोषणाओं से संबंधित मुद्दों की दो प्रबुद्ध चर्चाएं शामिल हैं। ध्यान रखें कि नाम देखने नियम वापस तो अलग थे:

  • तर्क पर निर्भर देखने अभी तक शुरू किया गया नहीं था (*)
  • नाम दोस्त-घोषणाओं के माध्यम से शुरू की शुद्ध अयोग्य देखने के माध्यम से नहीं पाए जाते हैं (कोई एडीएल नहीं) वर्तमान नियमों के अनुसार, [namespace.memdef] p3 और CWG 1477 देखें। एन0878 के उदाहरणों से पता चलता है कि उस समय शुद्ध नाम अयोग्यता के माध्यम से उन नामों को पाया जा सकता है।

(*) सबसे अच्छा मैं N0878 मार्च 1996, जो कहते से 'ए परिवर्तन हाल ही में काम कर कागज लिए बनाया गया था जोड़ने के लिए "था कोएनिग देखने नियम" "

पहले मिल सकता है , कार्यों के लिए N0783 से उदाहरण:

void f(char); 

namespace A { 
    class B { 
     friend void f(char); // ::f(char) is a friend 
     friend void f(int); // A::f(int) is a friend 

     void bf(); 
    }; 
    void B::bf() 
    { 
     f(1); // calls A::f(int); 
     f('x'); // also calls A::f(int) because ::f is hidden 
    } 
} 

दूसरा दोस्त घोषणा को लागू करना चाहिए एक नया समारोह N0783 यह घोषणा करने का प्रयास करता है कि इस घोषणा को किस दायरे में पेश किया गया है। यह

किसी दिए गए नाम के लिए सभी मित्र घोषणाओं को एक विशेष दायरे में इकाइयों की घोषणा करनी चाहिए।

एक सामान्य नियम के रूप में, उपर्युक्त स्थितियों की आश्चर्य से बचने के लिए।

तो सवाल यह है कि वे किस क्षेत्र में संस्थाओं की घोषणा करते हैं? वहाँ दो संभावनाएं हैं, या तो

  1. जब समारोह के पिछले घोषणा की तलाश कर रहे हैं, जब तक निकटतम संलग्नित नाम स्थान तक पहुँच जाता है देखो, या
  2. जब पिछले एक घोषणा की तलाश में, के लिए सभी संलग्न कार्यक्षेत्रों में देखो घोषित किए गए समारोह के नाम। यदि पिछले नाम का उपयोग पाया जाता है, तो घोषणा उस दायरे में इंजेक्शन दी जाती है। यदि नाम का कोई पिछला उपयोग नहीं मिला है तो मित्र को निकटतम संलग्न नामस्थान स्कोप में इंजेक्शन दिया गया है।

नियम # 2 मतलब यह होगा कि किसी भी समारोह की उपस्थिति एक में f बुलाया गुंजाइश enclosing, या नहीं, प्रकार से मेल खाते हैं, कारण यह है कि गुंजाइश में इंजेक्षन करने के लिए एक दोस्त घोषणा करने के लिए पर्याप्त होगा।

मेरा मानना ​​है कि नियम # 2 स्पष्ट रूप से अस्वीकार्य है। नामस्थान में किसी मित्र स्थान पर उस नाम की वैश्विक घोषणा से प्रभावित होगा। विचार करें कि ऑपरेटर कार्यों के लिए इसका क्या अर्थ होगा! की मौजूदगीoperator+ वैश्विक दायरे में कार्य सभी मित्र operator+ ऑपरेटरों को वैश्विक दायरे में भी दिखाई देने के लिए मजबूर करेगा! वैश्विक दायरे में एक टेम्पलेट की उपस्थिति के समान प्रभाव होगा।

वर्ग प्रकार के लिए:

namespace N { 
    class A { void f(); }; 
} 

using namespace N; 

namespace M { 
    class B { 
     friend class A; // Without this rule 
         // makes N::A a friend 
     B(); 
    }; 
    class A { void f(); }; 
} 

void N::A::f() { M::B b; } // A friend under current rules 

void M::A::f() { M::B b; } // A friend under proposed rules 

दोनों उदाहरण वर्तमान नियमों के तहत के रूप में दिलचस्प है क्योंकि दोस्त घोषणाओं के माध्यम से पेश किया नाम केवल ADL के माध्यम से पाए जाते हैं नहीं हैं। यह संभव है कि यह प्रतिबंध एक ऐतिहासिक कलाकृति है। एडीएल की शुरूआत के बाद इस प्रतिबंध के विकास का पालन करने के लिए अधिक "शोध" की आवश्यकता है।

+0

यह दिलचस्प है क्योंकि उदाहरण के लिए अभी तक 'void f (int) 'की अतिरिक्त घोषणा की आवश्यकता नहीं है, इसलिए उस समय' मित्र 'इसे घोषित करने के लिए पर्याप्त था और इसे पहले से ही दिखाना था। – Barry

+0

यह भी देखें: http://wg21.link/cwg138 – dyp

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