[英]Why do random access iterator's arithmetic operators accept / return int and not size_t?
由於std::vector
上的大多數操作都需要/ return size_t
- 這是我用於索引的類型。 但是現在我已經啟用所有編譯器警告來修復我知道的一些已簽名/未簽名的轉換問題,這條消息讓我感到驚訝:
警告C4365:'參數':從'size_t'轉換為'__w64 int',有符號/無符號不匹配
它是由以下代碼生成的:
std::vector<int> v;
size_t idx = 0;
v.insert(v.begin() + idx + 1, 0);
我有很多其他類似的消息表明迭代器的算術運算符接受並返回int
。 為什么不size_t
? 修復所有這些消息是一件痛苦的事,並不能使我的代碼更漂亮!
我有很多其他類似的消息表明迭代器的算術運算符接受並返回
int
。
不一定是int
。 它是迭代器類型的iterator_traits
定義的(帶符號) difference_type
。 對於大多數迭代器類型,默認為ptrdiff_t
。
為什么不
size_t
?
因為算術需要與有符號值一起正常工作; 人們會期望it + (-1)
等於it - 1
。
它允許像它這樣的東西it += index;
其中index
可以是正數也可以是負數(根據某些邏輯)。
與以下比較:
if (some_condition)
it += index;
else
it -= index;
如果我們只能傳遞無符號值,那將是必需的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.