如何通过std :: unique_ptr成员调用其他类的const成员函数

时间:2015-04-16 18:09:33

标签: c++ c++11 type-conversion smart-pointers unique-ptr

在阅读有关向标准库(文档编号N4388)添加const传播包装的提议时,我碰到了文章中给出的示例:

#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();
}

输出:

  
    

B :: foo(const)
A :: bar(非常数)

  

我明白为什么会这样。即使指针是const,它指向的对象也是非const的,所以确实调用了非const成员函数A::bar(这是本文提案的全部要点,避免这种看似尴尬的情况,并通过包装器传播const。此外,他们说为了避免这种情况,我可以在const_castm_ptrA指针B::foo() const,因此它会调用所需的A::bar() const

我尝试了无数组合,但坦率地说,我不知道如何const_cast unique_ptr。也就是说,我如何在B::foo() const强制实施&#34;权利&#34;通过A::bar() const致电m_ptrA? (如果代码中的注释并不完全清楚我想要的内容,请参阅代码中的注释。)

1 个答案:

答案 0 :(得分:5)

您需要const-cast存储的指针,而不是unique_ptr

const_cast<const A*>(m_ptrA.get())->bar();
const_cast<const A&>(*m_ptrA).bar();