c++ - 将 int 添加到 size_t 的正确方法

标签 c++

我收到关于以下代码的 Clang 警告“隐式转换更改签名”:

size_t x = 10;
int y = -1;
x += y;

x 是 std::vector 的索引,因此它应该是一个 unsigned long long(又名 size_t)是有道理的,但 y 是一个偏移量这可能是积极的或消极的,因此需要签名。我可以将 y 转换为 size_t 以消除警告并产生正确的结果,但这似乎不正确,因为转换为值肯定不再等于 -1。那么,有没有合适的方法将负数加到 size_t 上?

最佳答案

this doesn't seem correct because the cast-to value is definitely not equal to -1 anymore.

就相加的结果而言,不再是-1也没关系。它仍然与 -1 模 M 1 全等,因此无符号加法的结果正确。

1 M 是可表示值的数量。

So, is there a proper way to add a negative number to a size_t?

您可以完全按照示例中的操作进行操作。是对的。

如果你想让警告保持启用状态,并且想让它静音,那么你可以进行显式转换。但这实际上更容易出错,因为如果您不小心转换为错误的无符号类型(这可能由于重构而发生),则上述假设不再成立。因此,您还应该避免将转换后的无符号值存储在中间变量中。我建议您不要启用有问题的警告选项。


如评论中所述,由于您使用的是 size_t,因此您可能需要考虑使用 ptrdiff_t 作为偏移类型,这样您就可以对任何索引进行偏移.

更合适的方法是使用 vector::size_typevector::difference_type 索引 vector,尽管在​​实践中它们可能与 size_tptrdiff_t 相同。

关于c++ - 将 int 添加到 size_t 的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57896527/

相关文章:

c++ - 直接使用cin和operator分配内存>>

c++ - Jenkins 测试报告分析器与 catch 的集成

c++ - 在 C++ 中每 n 秒调用一次函数的最有效方法是什么?

c++ - 将 int 转换为 ASCII 字符

c++ - 为什么没有人使用 STL 命名约定?

c# - DllImport 期间出现 FatalExecutionEngineError

c++ - #include <lib.h> 找不到符号,为什么?

c++ - 函数内部的内存地址

c++ - CMake + GoogleTest 在小型库集合中给出重新定义错误

c++ - 使用 IXMLDOmDocument 指针设置 ProhibitDTD 属性