2015-12-17 6 views
12

std::unique_ptr::operator-> हस्ताक्षरunique_ptr ऑपरेटर क्यों है-> कॉन्स्ट-ओवरलोड नहीं किया गया है?

pointer operator->() const noexcept; 

तो operator-> स्थिरांक है, लेकिन एक परिवर्तनशील सूचक देता है। यह कोड के लिए अनुमति देता है:

void myConstMemberFunction() const 
{ 
    myUniquePtrMember->nonConstFunction(); 
} 

मानक यह क्यों अनुमति देता है, और ऊपर प्रस्तुत किए गए उपयोग को रोकने के लिए सबसे अच्छा तरीका क्या है?

+0

मैं उम्मीद यह है, क्योंकि ऑपरेटर '.' अतिभारित नहीं किया जा सकता की जरूरत है। – erip

+2

सी ++ में 'const' उथला है। एक 'int * const' आपको ऑब्जेक्ट की ओर इशारा करने की अनुमति देता है। –

+4

एक ही कोड की अनुमति दी जाएगी, तो सूचक स्मार्ट नहीं थे। स्थिरता पॉइंटर पर नहीं, पॉइंटर पर लागू होती है। – juanchopanza

उत्तर

17

एक सामान्य सूचक की तरह इसके बारे में सोचो:

int * const i; 

गैर constint करने के लिए एक const सूचक है। आप int बदल सकते हैं, लेकिन सूचक नहीं।

int const * i; 

एक constint करने के लिए एक गैर const सूचक है। आप सूचक बदल सकते हैं लेकिन int नहीं।


अब, unique_ptr के लिए, यह const अंदर या <> बाहर चला जाता है कि क्या की एक सवाल है। तो:

std::unique_ptr<int> const u; 

पहले की तरह है। आप int बदल सकते हैं, लेकिन सूचक नहीं।

क्या आप चाहते हैं:

std::unique_ptr<int const> u; 

आप सूचक को बदल सकते हैं, लेकिन नहीं int। या शायद भी:

std::unique_ptr<int const> const u; 

यहाँ आप सूचक याint नहीं बदल सकते।


सूचना कैसे मैं हमेशा सही पर const जगह? यह थोड़ा असामान्य है, लेकिन पॉइंटर्स से निपटने के दौरान आवश्यक है। const हमेशा बाईं ओर तुरंत उस चीज़ पर लागू होता है, चाहे * (सूचक const), या int है। http://kuhllib.com/2012/01/17/continental-const-placement/ देखें।

const int लेखन, सोच int const * तक ले सकता है एक गैर constint करने के लिए एक const -pointer है, जो गलत है।

7

यह पारंपरिक पॉइंटर्स के अर्थशास्त्र को दोहराता है। एक const पॉइंटर एक सूचक है जिसे उत्परिवर्तित नहीं किया जा सकता है। हालांकि, यह वस्तु जो इंगित करती है वह कर सकती है।

struct bar { 
    void do_bar() {} 
}; 

struct foo { 
    void do_foo() const { b->do_bar(); } // OK 
    bar* const b; 
}; 

pointee परिवर्तनशील बचने के लिए आप स्थिरांक को स्थिरांक सूचक की unique_ptr बराबर, या

const std::unique_ptr<const bar> b; 
संबंधित मुद्दे