构建一个依赖于非const正确库的const-correct(C ++)库

时间:2014-06-13 21:43:59

标签: c++ const-correctness

我正在用C ++建立一个图书馆(主要是为了好玩),我现在已经工作了一段时间(多年,哈哈,这只是一个爱好)

我最近将一些基础(读取,库依赖)切换到另一个库。不幸的是,所述库并不关心'const-correctness'。我有点强迫症,我喜欢挑战自己做“正确的方式”,所以我想让我的库保持正确。我已经开始了几次,有些部分是;我知道最好从一开始就开始使用const-for,但这并不是真的相关或争论不休。事实是,我有兴趣再次认真考虑,但另一个图书馆阻止我这样做。

怎么样,你可能会问?

好吧,如果我正在调用一个显然应该是const的方法(实际上并没有改变任何东西),并且我的方法也是consting(新词)的候选者,我无法确保我的方法的常量直到其他方法也是const。

示例:

// Bad third-party library

struct Foo
{
    void should_be_const() {}
};

// My library

struct Bar
{
    Foo my_foo;
    void should_be_const() const
    {
        my_foo.should_be_const(); // ERROR!  Not a const function!
    }
};

这只有我从经验证据和我对有关常数的研究和理解中才能看出来。然而,这可能是一种错误形成的理解,所以我是开放的(并且有希望?)它是错误的并且以其他方式显示(尽管这会动摇我对常数的理解的基础哈哈)

如果他(或她)想要写一个合适的图书馆,但依赖性不是这样编写的话,那么做一个可怜的灵魂是什么?

我希望这是一个适合SO的问题。请(我相信你会)告诉我,如果没有,或者是否有更好的StackExchange网站发布它。

P.S。我找到了this SO question,但我希望能够详细说明主题/解决方案。

1 个答案:

答案 0 :(得分:2)

你引用的另一个问题在问题上给出了很好的线索,但我会对答案产生不同意见。子库中的接口将分为四种情况。

  1. 那些不是常数而且不能指望的东西。
  2. 正确宣布为const的事情
  3. 逻辑上应该是const的东西,

    3A。是这样实现但未声明

    3B。没有这样实施

  4. 案例1很简单 - 如果你希望你的是const,那么你需要在调用该接口之前复制输入。演员阵容错误,最终会导致崩溃或其他错误。案例2不是问题。案例3就是这样。

    不幸的是,现实情况是案例3a和3b应该与案例1相同,因为它们无法区分。实施可能会因平台或版本而改变。因此,您应该创建一个副本,然后调用该接口。请注意我说'#34;应该。"实际情况是,我们大多数人都会使用const_cast来调用我们认为理解的接口(例如strcmp)。它成为一个关于我们对实施有多自信的判断。就个人而言,我不担心strcmp。几乎任何更高级别的东西都可以使用类似strtok的东西来破坏东西。