簡體   English   中英

構建一個依賴於非const正確庫的const-correct(C ++)庫

[英]Building a const-correct (C++) library that relies on a non-const-correct library

我正在用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網站發布它。

PS我發現了這個問題 ,但我希望能夠詳細闡述主題/解決方案。

你引用的另一個問題在問題上給出了很好的線索,但我會對答案產生不同意見。 子庫中的接口將分為四種情況。

  1. 不是常數而且不能指望的東西。
  2. 事情正確地宣布為const
  3. 邏輯上應該是const的東西,和

    3A。 是這樣實現的,但沒有聲明

    3B。 沒有這樣實現

案例1很簡單 - 如果你希望你的是const,那么你需要在調用該接口之前復制輸入。 演員陣容錯誤,最終會導致崩潰或其他錯誤。 案例2不是問題。 案例3就是這樣。

不幸的是,現實情況是案例3a和3b應該與案例1相同,因為它們是難以區分的。 實施可能會因平台或版本而改變。 因此,您應該創建一個副本,然后調用該接口。 注意我說“應該”。 實際情況是,我們大多數人都會使用const_cast來調用我們認為理解的接口(例如strcmp)。 它成為一個關於我們對實施有多自信的判斷。 就個人而言,我不擔心strcmp。 幾乎任何更高級別的東西都可以使用類似strtok的東西來破壞事物。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM