के माध्यम से अन्य वर्ग 'कॉन्स्ट सदस्य फ़ंक्शन को कैसे कॉल करें मानक पुस्तकालय (दस्तावेज़ संख्या N4388) में एक कॉन्स्ट-प्रोपेगेटिंग रैपर जोड़ने के प्रस्ताव के बारे में पढ़ने के दौरान, मैंने दिए गए उदाहरण में टक्कर लगी कागज:एक कक्षा :: unique_ptr सदस्य
#include <memory>
#include <iostream>
struct A
{
void bar() const
{
std::cout << "A::bar (const)" << std::endl;
}
void bar()
{
std::cout << "A::bar (non-const)" << std::endl;
}
};
struct B
{
B() : m_ptrA(std::make_unique<A>()) {}
void foo() const
{
std::cout << "B::foo (const)" << std::endl;
m_ptrA->bar(); // calls A::bar() (non-const)
// const_cast<const std::unique_ptr<A>>(m_ptrA)->bar(); // how to call the A::bar() const?
}
void foo()
{
std::cout << "B::foo (non-const)" << std::endl;
m_ptrA->bar();
}
std::unique_ptr<A> m_ptrA;
};
int main()
{
const B const_b;
const_b.foo();
}
जो आउटपुट:
बी :: foo (स्थिरांक)
एक :: बार (गैर स्थिरांक)
मुझे समझ में आता है कि ऐसा क्यों होता है। यहां तक कि यदि सूचक const
है, तो ऑब्जेक्ट यह इंगित करता है कि गैर-कॉन्स सदस्य A::bar
कहा जाता है (यह पेपर में प्रस्ताव का पूरा बिंदु है, यह प्रतीत होता है कि यह अजीब स्थिति से बचने और const
प्रसारित करने के लिए एक रैपर के माध्यम से)। इसके अलावा, वे कहते हैं कि इस स्थिति से बचने के लिए, const_cast
सूचक m_ptrA
B::foo() const
में, इसलिए यह वांछित A::bar() const
पर कॉल कर सकता है।
मैंने अनगिनत संयोजनों की कोशिश की लेकिन स्पष्ट रूप से मुझे नहीं पता कि const_cast
unique_ptr
कैसे करें। अर्थात् m_ptrA
के माध्यम से A::bar() const
पर "दाएं" कॉल को B::foo() const
में कैसे लागू किया जा सकता है? (कोड में टिप्पणी भी देखें यदि यह पूरी तरह स्पष्ट नहीं है कि मैं क्या चाहता हूं)।
'static_cast (* ptr) .method()' –