2017-02-06 9 views
19

find_type कैसे पता चलता है कि फ़ंक्शन typemap है?
वह जो तर्क प्राप्त करता है वह उस नामस्थान से नहीं है, यह std नामस्थान से है!यह एडीएल केस क्यों काम कर रहा है?

#include <type_traits> 
#include <memory> 

namespace lib { 
    template<typename T> 
    struct find_type { 
     using type = decltype(typemap(std::declval<T>())); 
    }; 
} 

namespace test { 
    struct Test {}; 
    auto typemap(std::unique_ptr<Test>) -> int;  
} 

static_assert(std::is_same<int, lib::find_type<std::unique_ptr<test::Test>>::type>::value, ""); 

यह कोड कैसे काम कर सकता है? इस नियम को अनुमति देने वाला नियम क्या है?

मैंने इसे जीसीसी 6.3 और क्लैंग 3.9.1 के साथ परीक्षण किया।

+6

संरचना 'find_type' से टेम्पलेट पैरामीटर' टी' का पैरामीटर प्रकार 'std :: unique_ptr ' है। 'std :: unique_ptr' एडीएल के लिए 'test :: test' टेम्पलेट पैरामीटर मानता है, और इस प्रकार,' test' NS में' typemap' फ़ंक्शन पाता है – SebNag

उत्तर

19

C++ मानक N4618 §3.4.2 [basic.lookup.argdep] (2,2)

हैं टी (यूनियनों सहित), उसके संबंधित वर्ग हैं एक वर्ग प्रकार है: कक्षा में ही; जिस वर्ग की यह सदस्य है, यदि कोई है; और इसके प्रत्यक्ष और अप्रत्यक्ष आधार वर्ग। इसके संबंधित नामस्थान निकटतम हैं जो इसके संबंधित वर्गों के नामस्थान संलग्न करते हैं। इसके अलावा, यदि टी एक क्लास टेम्पलेट विशेषज्ञता है, इसके संबंधित नामस्थान और कक्षाओं में भी शामिल हैं: टेम्पलेट प्रकार पैरामीटर (टेम्पलेट टेम्पलेट पैरामीटर को छोड़कर) टेम्पलेट तर्कों के प्रकारों से जुड़े नामस्थान और कक्षाएं; जिन नामों का कोई टेम्पलेट टेम्पलेट तर्क सदस्य हैं; और कक्षा जिसमें से कोई सदस्य टेम्पलेट टेम्पलेट टेम्पलेट तर्क के रूप में उपयोग किया जाता है सदस्य हैं।

typemap का तर्क std::unique_ptr<test::Test> है, इसलिए नाम स्थान test नाम के लिए ऊपर देखो माना जाता है।

14

यह प्राप्त नाम उस नामस्थान से नहीं है, यह std नेमस्पेस से है!

यह सब नहीं!

using type = decltype(typemap(std::declval<T>())); 

यह वह जगह है:

using type = decltype(typemap(std::declval<std::unique_ptr<test::Test>>())); 

वहाँ है, इसलिए नाम स्थान test भी खोजा गया है वहाँ में एक test:: है।

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