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

虚拟软件公司

在阅读有关将const传播包装器添加到标准库的建议(文件号N4388)时,我碰到了本文给出的示例:

#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(常量)
A :: bar(非常量)

我知道为什么会这样。即使指针是const,它指向的对象也是非常量的,所以确实A::bar调用了非常量成员函数(这是本文建议的全部要点,以避免这种看似尴尬的情况并const通过包装器传播)。此外,他们说,为了避免这种情况,一旦可以const_cast指针m_ptrAB::foo() const,所以它调用所需A::bar() const

我试过无数的组合,但坦率地说,我不知道怎么const_castunique_ptr也就是说,我怎么能在强制执行B::foo() const“正确”的呼叫A::bar() const通过m_ptrA(如果还不清楚我想要什么,请参见代码中的注释)。

StenSoft

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章