c++ - 有符号和无符号之间的比较。 static_cast 是唯一的解决方案吗?

标签 c++ c++11 implicit-conversion static-cast

我使用使用 int 存储大小的第三方容器。我还使用使用 size_t 存储大小的 STL 容器。

我经常在我的代码中必须在同一个循环中使用两者,例如:

// 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 确实是唯一安全的解决方案。我应该将 int 转换为 size_t 还是将 size_t 转换为 int

谢谢。

最佳答案

二元运算符(此处为operator==)如果其中一个参数是无符号的,则将有符号整数转换为无符号整数。一个带符号的负整数变成一个大的正整数。

容器元素数不能为负数,以免违反最小意外原则。因此,隐式转换必须是安全的。但一定要检查 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()));

关于c++ - 有符号和无符号之间的比较。 static_cast 是唯一的解决方案吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53545143/

相关文章:

c++ - 为什么此 C++ 代码中的构造函数不明确,我该如何解决?

c++ - C/C++ 中的 svg 示例

c++ - 静态 constexpr int 与老式枚举 : when and why?

C++如何制作这种构造函数的原型(prototype)?

c++ - 更新 Vector 中对象的属性

scala - 关于隐式的奇怪错误消息

c# - 基于变量的第 n 个字符未按预期工作

c++ - 使用 getline 给出错误 : no matching function for call to ‘getline(std::istream&, const string&)’

c++ - FREENECT_DEPTH_REGISTERED 对 libfreenect 没有影响

c++ - 哪里可以下载适用于 Windows XP 的 Visual C++