我最近将一些基础(读取,库依赖)切换到另一个库.不幸的是,所述库并不关心’const-correctness’.我有点强迫症,我喜欢挑战自己做“正确的方式”,所以我想让我的库保持正确.我已经开始这几次,有些部分是;我知道最好从一开始就开始使用const-correct,但这并不是真的相关或争论不休.事实是,我有兴趣再次认真考虑,但另一个图书馆阻止我这样做.
怎么样,你可能会问?
好吧,如果我正在调用一个显然应该是const的方法(实际上没有改变任何东西),并且我的方法也是consting(新词)的候选者,我无法确保我的方法的常量,直到其他方法也是常量.
例:
// 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网站发布.
附:我找到了this SO question,但我希望能够详细阐述主题/解决方案.
解决方法
>那些不是常数而且无法期望的东西.
>事情正确地宣布为const
>逻辑上应该是const的东西,和
3A.是这样实现但未声明
3B.没有这样实现
案例1很简单 – 如果你希望你的是const,那么你需要在调用该接口之前复制输入.演员阵容错误,最终会导致崩溃或其他错误.案例2不是问题.所以案例3就是这样.
不幸的是,现实情况是案例3a和3b应该与案例1相同,因为它们是无法区分的.实施可能会因平台或版本而改变.因此,您应该创建一个副本,然后调用该接口.注意我说“应该”.实际情况是,我们大多数人都会使用const_cast来调用我们认为理解的接口(例如strcmp).它成为一个关于我们对实施有多自信的判断.就个人而言,我不担心strcmp.几乎任何更高级别的东西都可以使用类似strtok的东西来破坏事物.