簡體   English   中英

簽名和未簽名的比較。 static_cast是唯一的解決方案嗎?

[英]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

  • 這種特殊情況下的隱式轉換是否危險?
  • 在我的情況下,功能風格是否可以?
  • 如果static_cast真的是唯一安全的解決方案。 我應該將intsize_tsize_tint嗎?

謝謝。

二進制運算符( 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.

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