如果我减少 `std::size_t(0)`,是否保证它等于 `std::size_t(-1)`?

4
这是它的证据:
inline
constexpr std::size_t prev(std::size_t i) {
    --i;
    return i;
}

int main() {
    static const std::size_t i = 0;
    static_assert(prev(i) == std::size_t(-1), "Decrementing should give     std::size_t(-1)");    
    return 0;
}

使用-std=c++14编译可以顺利通过。

我遇到这个问题是因为我需要对std::vector进行反向循环,所以我将循环索引更改为:

for (std::size_t i = std::min(idx, v.size() - 1); i != std::size_t(-1); --i) { ... }

现在,我意识到我可以使用 std::vector::reverse_iterator,但我的真正问题是,我期望的行为是否有明确定义?


相关链接:https://dev59.com/fmox5IYBdhLWcg3weUCe,https://dev59.com/OWMl5IYBdhLWcg3wsIyA,https://dev59.com/U2Qo5IYBdhLWcg3wbe_r - Justin
1
@Justin 这些是关于无符号整数溢出,而不是这里发生的下溢。 - Some programmer dude
到目前为止我找到的最好的复制品是:https://dev59.com/5W_Xa4cB1Zd3GeqPxh9P - NathanOliver
这个怎么样?(https://dev59.com/M3E85IYBdhLWcg3wejZO) - François Andrieux
2个回答

6

是的

size_t是一个未指定的无符号整数。

C++中的所有无符号整数都被建模为模2n整数环的元素,其中n是特定于该无符号整数类型的数字。

当您将有符号整数转换为无符号整数时,您会得到该无符号类型的常数n在模2n整数环中的值。对于-1,这是2n-1。

当您将无符号整数类型的0递减时,您会得到2n-1。

这两个值是相同的。

请参见C++标准中的[basic.fundamental] 3.9.1/4:

无符号整数应遵守算术模运算的规律 2n 其中 n 是该特定大小整数的值表示中的位数。

(引用自最近的草案标准N3690,但它所代表的真相不会很快改变;段落编号可能会更改。)

查找有关如何从有符号整数进行转换的引用将涉及更多的标准追踪;但它最终会成为您想要的。


5

你得到了绿色勾选标记,因为你在增量和减量运算符上的细节表现非常出色。 - Ben

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接