![](/img/trans.png)
[英]Is there difference between static_cast<unsigned>(signed) vs std::bit_cast<unsigned>(signed)?
[英]Comparison between signed and unsigned. Is static_cast the only solution?
我使用第三方容器使用int
來存儲大小。 我還使用stl容器,它使用size_t
來存儲大小。
我經常在我的代碼中必須在同一個循環中使用它們,例如:
// vec is std::vector
// list is the third party container
assert(vec.size() == list.size()); // warning
for(size_t i = 0; i < vec.size(); i++)
{
vec[i] = list[i]; // warning
}
所以要修復我要么做功能樣式轉換,我被告知是偽裝的C風格轉換。
// vec is std::vector
// list is the third party container
assert(int(vec.size()) == list.size());
for(size_t i = 0; i < vec.size(); i++)
{
vec[i] = list[int(i)];
}
或者我可以做出每個人都推薦的更加丑陋的解決方案。 靜態鑄造。
// vec is std::vector
// list is the third party container
assert(static_cast<int>(vec.size()) == list.size());
for(size_t i = 0; i < vec.size(); i++)
{
vec[i] = list[static_cast<int>(i)];
}
我真的不想要static_cast
。
int
為size_t
或size_t
到int
嗎? 謝謝。
二進制運算符( operator==
here)如果其中一個參數是無符號的,則將有符號整數轉換為無符號整數。 帶符號的負整數變為大的正整數。
容器元素計數不得為負,以避免破壞最小驚喜的原則。 因此,隱式轉換必須是安全的。 但一定要檢查int size() const
的實現/文檔。
您可能希望保留隱式轉換的語義,並使用as_unsigned
函數來避免轉換並更好地傳達意圖:
#include <type_traits>
template<class T>
inline typename std::make_unsigned<T>::type as_unsigned(T a) {
return static_cast<typename std::make_unsigned<T>::type>(a);
}
然后:
assert(vec.size() == as_unsigned(list.size()));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.