簡體   English   中英

為什么 (C++) 類型是常規的是個好主意?

[英]Why is it a good idea for (C++) types to be regular?

這個問題源於關於 stream 迭代器的更具體的問題。)

如果滿足以下條件,則稱類型 [Stepanov, McJones] 為Regular

  • 它是相等可比較的
  • 它是可分配的(來自該類型的其他值)
  • 它是可破壞的
  • 它是默認可構造的(即無需參數即可構造)
  • 它的值有一個(默認)總排序

(還有一些關於“底層類型”的措辭,我不太明白。)

一些/許多人聲稱,在設計類型時——例如,對於 C++ 的標准庫——努力使這些類型規則化是值得的,甚至是重要的,可能會忽略總順序要求。 有人提到格言:

int那樣做。

事實上, int類型滿足所有這些要求。 但是,默認可構造類型在構造時會持有某種 null、無效或垃圾值 - int就是這樣。 一種不同的方法要求在構建時進行初始化(並在銷毀時取消初始化),以便對象的生命周期與其生存時間相對應。

為了對比這兩種方法,人們或許可以考慮一種 T 指針類型,以及一種 T 引用或 T 引用包裝器類型。 指針基本上是規則的(排序假定線性地址空間),並且有需要注意的nullptr 在引擎蓋下,引用是一個指針——但你不能只構造一個無引用或垃圾引用。 現在,指針可能有它們的位置,但我們更喜歡使用引用(或者可能是可分配的引用包裝器)。

那么,為什么我們應該更喜歡設計(作為庫作者)和使用常規類型呢? 或者至少,我們為什么要在這么多情況下更喜歡它們?

我懷疑這是最重要的答案,但你可以說“沒有未初始化的狀態”/“沒有垃圾值”是一個不適合移動分配的原則:在你從你的價值中移動之后,並采取它的資源消失了 - 它留在什么 state 中? 它與默認構造它相距不遠(除非移動分配基於某種交換;但是那么 - 你可以看看移動構造)。

反駁是:“好吧,所以我們不要讓這種類型的移動可分配,只有移動可破壞”; 不幸的是 - C++ 在 2000 年代的某個時候決定使用非破壞性移動到 go。 另請參閱@HowardHinnant 的這個問題和答案:

為什么 C++ 移動語義離開構造的源?

暫無
暫無

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

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