2017-04-17 18 views
21

ध्यान दें कि मैं std::thread का उपयोग सिर्फ त्रुटियों में पठनीय प्रकार प्राप्त करने के लिए:std :: remove_const कॉन्स्ट क्वालिफायर को क्यों नहीं हटाता है?

int main() { 
    const int * first; 
    using deref = decltype(*first); 
    std::thread s = std::remove_const<deref>::type{}; // const int ??? 
    std::thread s2 = deref{}; // const int 
    std::thread s3 = std::remove_const<const int>::type{}; // int 
} 

ऐसा लगता है मानो remove_const<deref>::typeconst int परिवर्तनशील है, नहीं int के रूप में मैं उम्मीद होती है।

+3

आपका शीर्षक 'remove_reference' कहता है, लेकिन आप इसे अपने शरीर में उपयोग नहीं करते हैं। –

+0

टीएनएक्स, फिक्स्ड, दोनों मूल कोड में उपयोग कर रहा था इसलिए मैंने इसे मिश्रित किया :) – NoSenseEtAl

+4

मैं आपको [this] (http://coliru.stacked-crooked.com/a/bfccfe0a5508f107) का उपयोग करने के बजाय अपने प्रकार के प्रकार दिखाने के लिए अनुशंसा करता हूं 'std :: thread' विधि क्योंकि यह वास्तविक प्रकार दिखाता है जो' const int 'है जबकि आपकी विधि आपके लिए है और' const int 'दिखाती है। – nwp

उत्तर

30

ध्यान दें कि *first एक lvalue अभिव्यक्ति है, तो decltype(*first) का परिणाम प्रकार const int&, अर्थात const int के लिए एक संदर्भ होगा। संदर्भ const स्वयं नहीं है (यह कॉन्स्ट-योग्य नहीं हो सकता है, int& const जैसी कोई चीज़ नहीं है), std::remove_const का उपयोग करके, उसी प्रकार, यानी const int& का उपयोग करेगा।

decltype specifier देखें: तर्क प्रकार T के किसी भी अन्य अभिव्यक्ति, और

ख) यदि अभिव्यक्ति के मूल्य वर्ग lvalue है, तो decltype पैदावार T& है

3) है;

आप एक साथ std::remove_reference साथ std::remove_const इस्तेमाल कर सकते हैं:

std::remove_const<std::remove_reference<deref>::type>::type // -> int 
             ~~~~~    // -> const int & 
        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  // -> const int 

BTW

:

ध्यान दें कि मैं std::thread का उपयोग सिर्फ पठनीय प्रकार प्राप्त करने के लिए त्रुटियों में:

ध्यान दें कि यह इस मामले के लिए सही प्रकार नहीं देता है। यहाँ Effective Modern C++ (Scott Meyers) से इस के लिए एक वर्ग टेम्पलेट सहायक है:

template<typename T> 
class TD; 

और के रूप में

TD<deref> td; 

इसका इस्तेमाल आप deref के प्रकार युक्त त्रुटि संदेश, उदा मिलेगा clang से:

prog.cc:16:11: error: implicit instantiation of undefined template 'TD<const int &>' 
TD<deref> td; 
     ^
+2

आआण्ड यही कारण है कि आपको 'const const 'के बजाय' int const &' लिखना चाहिए ... फिर प्रश्न का उत्तर स्पष्ट है। – Mehrdad

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