我正在用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,但我希望能够详细说明主题/解决方案。
答案 0 :(得分:2)
你引用的另一个问题在问题上给出了很好的线索,但我会对答案产生不同意见。子库中的接口将分为四种情况。
逻辑上应该是const的东西,
3A。是这样实现但未声明
3B。没有这样实施
案例1很简单 - 如果你希望你的是const,那么你需要在调用该接口之前复制输入。演员阵容错误,最终会导致崩溃或其他错误。案例2不是问题。案例3就是这样。
不幸的是,现实情况是案例3a和3b应该与案例1相同,因为它们无法区分。实施可能会因平台或版本而改变。因此,您应该创建一个副本,然后调用该接口。请注意我说'#34;应该。"实际情况是,我们大多数人都会使用const_cast来调用我们认为理解的接口(例如strcmp)。它成为一个关于我们对实施有多自信的判断。就个人而言,我不担心strcmp。几乎任何更高级别的东西都可以使用类似strtok的东西来破坏东西。