2011-06-02 22 views
8

मैं "C++ Template Metaprogramming" by Abrahams & Gurtovoy के माध्यम से काम कर रहा हूँ " यह नहीं वास्तव में दो अध्याय में है, लेकिन कुछ मैं पहले व्यायाम पर काम कर रहा है जबकि करने की कोशिश की है (2.10, 2.0) जो मुझे भ्रमित कर रहा है:बढ़ावा :: is_same <int const और, boost :: add_const <int &> :: मूल्य बराबर झूठा क्यों है?

#include <iostream> 
#include <boost/type_traits.hpp> 

std::string display(bool b) 
{ 
    return (b ? "true" : "false"); 
} 

int main() 
{ 
    using namespace std; 

    cout << display(boost::is_same<int const&, boost::add_const<int &>::type >::value) << "\n"; 

    return 0; 
} 

उत्पादन होता है ' झूठी '। लेकिन अगर मैं संदर्भ निकाल, यानी' पूर्णांक स्थिरांक 'और' पूर्णांक सच ''। उत्पादन होता है '।

+3

बीटीडब्ल्यू आप 'std :: cout << std :: boolalpha;' – juanchopanza

उत्तर

11

आप, संकेत के साथ एक ही बात करने की कोशिश की,

boost::is_same<int const *, boost::add_const<int *>::type>::value 

आपको पता चल चाहते हैं कि यह भी गलत है के रूप में के बाद से boost::add_const<int *>::typeint *const प्रकार है, जो स्पष्ट रूप से int const * के समान नहीं है उत्पन्न करता है।

अनिवार्य रूप से वही बात संदर्भों के साथ होती है, यानी boost::add_const<int &>::typeint &const उत्पन्न करने का प्रयास है। औपचारिक रूप से, int &const टाइप करें C++ में अवैध है - सीवी-योग्यता संदर्भ पर ही लागू नहीं की जा सकती है। तो, boost::add_const इस मामले में नो-ऑप होने के लिए डिज़ाइन किया गया है, जिसका अर्थ है कि boost::add_const<int &>::typeint & उत्पन्न करता है।

+0

मुझे अब मिल गया है। मुझे लगता है कि add_const मुझे int const देगा और यह कॉन्स * दूसरी तरफ * जोड़ने का प्रयास करता है, धन्यवाद –

9

आप स्थिरांक एक संदर्भ को नहीं जोड़ सकते, यह int& const जो संभव नहीं है किया जाएगा।

बस टाइपिफ़ के साथ, q जोड़ना ualifiers एक पाठ प्रतिस्थापन नहीं है लेकिन कुछ ऐसा जो पूरे प्रकार पर काम करता है।

+0

सेट करके अपने 'प्रदर्शन' फ़ंक्शन से बच सकते हैं। यह संकेत (यदि यह स्पष्ट नहीं था) तो यह है कि 'boost :: add_const :: प्रकार 'अभी भी 'int'' है। – ildjarn

+0

आधिकारिक दस्तावेज़ीकरण के उदाहरणों में दिखाए गए अनुसार: http://www.boost.org/doc/libs/1_46_1/libs/type_traits/doc/html/boost_typetraits/reference/add_const.html –

+0

और वास्तव में 'int & const' अवैध है यदि इसकी अनुमति थी, तो यह अनिवार्य होगा क्योंकि एक संदर्भ पहले से ही निहित है। –

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