如何通过 std::unique_ptr 成员调用其他 class' const 成员函数
How to call other class' const member function via a std::unique_ptr member
在阅读有关将 const-propagating 包装器添加到标准库的提案(文档编号 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 (const)
A::bar (non-const)
我明白为什么会这样。即使指针是const
,它指向的对象是非常量的,所以确实调用了非常量成员函数A::bar
(这是论文中提案的重点,以避免这种看似尴尬的情况并通过包装器传播 const
)。此外,他们说为了避免这种情况,一旦可以 const_cast
指针 m_ptrA
在 B::foo() const
中,所以它调用所需的 A::bar() const
。
我尝试了无数种组合,但坦率地说,我不知道如何 const_cast
unique_ptr
。即,我如何在 B::foo() const
中强制执行 "right" 通过 m_ptrA
调用 A::bar() const
? (如果我不完全清楚我想要什么,另请参阅代码中的注释)。
您需要对存储的指针进行常量转换,而不是 unique_ptr
:
const_cast<const A*>(m_ptrA.get())->bar();
const_cast<const A&>(*m_ptrA).bar();
在阅读有关将 const-propagating 包装器添加到标准库的提案(文档编号 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 (const)
A::bar (non-const)
我明白为什么会这样。即使指针是const
,它指向的对象是非常量的,所以确实调用了非常量成员函数A::bar
(这是论文中提案的重点,以避免这种看似尴尬的情况并通过包装器传播 const
)。此外,他们说为了避免这种情况,一旦可以 const_cast
指针 m_ptrA
在 B::foo() const
中,所以它调用所需的 A::bar() const
。
我尝试了无数种组合,但坦率地说,我不知道如何 const_cast
unique_ptr
。即,我如何在 B::foo() const
中强制执行 "right" 通过 m_ptrA
调用 A::bar() const
? (如果我不完全清楚我想要什么,另请参阅代码中的注释)。
您需要对存储的指针进行常量转换,而不是 unique_ptr
:
const_cast<const A*>(m_ptrA.get())->bar();
const_cast<const A&>(*m_ptrA).bar();