我遇到了一个C++ 11中具有const正确性的小问题,我希望我能得到澄清-我认为这还没有被问到!

假设我们有一个类A,其中包含我们要公开的类B的实例。如果我们将其公开作为引用,我们将提供getter的const版本和非const版本:

class B;

class A final
{
public:
    B& GetB()
    {
        return m_b;
    }
    const B& GetB() const
    {
        return m_b;
    }
private:
    B m_b;
};

但是,如果我们只有一个指向B的指针,我们将提供一个为const的getter,但返回指向B的非const实例的指针的副本。这是因为A并不拥有B,它仅拥有该指针,因此,对B的外部修改不会改变A的状态。(注意:我是根据个人经验得出的结论;我从未发现任何明确说明这是应该如何工作的东西)
class B;

class A final
{
public:
    A(B* b)
    {
        m_b = b;
    }
    A* GetB() const
    {
        return m_b;
    }
private:
    B* m_b;
};

到目前为止,这一切都说得通,但是如果A拥有指向B的唯一指针(或与此相关的共享指针),我们该怎么办? A现在逻辑上拥有B-即使不是字面意义上的。到目前为止,在将原始指针公开给共享指针时,我一直遵循上面的第二个示例,但是由于A在逻辑上拥有B,所以我应该做与第一个示例更相似的事情吗?
class B;

class A final
{
public:
    A(std::unique_ptr<B> b)
    {
        m_b = std::move(b);
    }
    B* GetB()
    {
        return m_b.get();
    }
    const B* GetB() const
    {
        return m_b.get();
    }
private:
    std::unique_ptr<B> m_b;
};

最佳答案

对于所有权情况,如果成员函数可以修改逻辑const对象的一部分,恕我直言是不自然的,但这是一个设计问题。

但是,请注意,可以使用原始指针来实现所有权。

例如,考虑使用直接new -ing和原始指针实现的内部数组。您不希望当/如果将其替换为用于处理存储的std::vector时会中断的接口(interface)。因此,是否提供访问函数对的const / non-const对的规则必须植根于设计级别,而不是该语言在给定设计实现中所允许的语言。

10-06 13:44
查看更多