【问题标题】:Am I breaking const-correctness if I expose a const and non-const API?如果我公开 const 和非 const API,我是否会破坏 const 正确性?
【发布时间】:2020-02-09 13:15:00
【问题描述】:

我正在设计一个类,并且对 const 的正确性有些担心,但我认为我没有完全理解这个概念的真正含义。如果我存储一个指向非 const 类型的原始指针并希望为该指针提供 const 和非 const 访问器,这会破坏 const 正确性吗?

class A
{
public:
    void SetCount(int* pCount)
    {
        m_pCount = pCount;
    }

    void GetCount(const int** ppCount) const
    {
        *ppCount = m_pCount;
    }

    void GetCount(int** ppCount) const
    {
        *ppCount = m_pCount;
    }

private:
    int* m_pCount = nullptr;
};

int main()
{
    int count = 10;

    A a;
    a.SetCount(&count);

    const int* pCountConst = nullptr;
    a.GetCount(&pCountConst);

    // Prints 10.
    std::cout << *pCountConst << std::endl;

    int* pCountNonConst = nullptr;
    a.GetCount(&pCountNonConst);
    (*pCountNonConst)++;

    // Prints 11.
    std::cout << *pCountConst << std::endl;
}

pCount 的类型是const int*,所以我们希望底层的int 一旦初始化就永远不会改变。在我看来,我们在这里打破了 const 正确性,这是真的吗?

【问题讨论】:

    标签: c++ constants const-correctness


    【解决方案1】:

    这取决于你的语义,但我不认为我会使用你在这里拥有的功能。相反,我会考虑以下两个选项:

    如果你想让 A 拥有这个计数变量,那么你应该在访问它时保留const-ness。在这种情况下,您可以这样编写函数:

    void GetCount(const int** ppCount) const
    {
        *ppCount = m_pCount;
    }
    
    void GetCount(int** ppCount) // note - omitted const
    {
        *ppCount = m_pCount;
    }
    

    这意味着如果你有一个非constA,你可以得到一个非常量计数器,但如果你有一个constA,你只能得到一个const 计数器。


    您也可能意味着 A 只是观察一些计数变量。在这种情况下,const 观察者意味着你不会改变你指向的 int,但它本身可能会改变。在这种情况下,您可以这样编写访问器:

    void GetCount(int** ppCount) const
    {
        *ppCount = m_pCount;
    }
    

    一般来说,我会说更喜欢第一种方法并保留const-ness,但另一种方法在某些情况下肯定是有效的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多