布尔值向量的基于范围 for 循环



std::vector<bool>使用代理迭代器。

所以下面的代码不会编译(代码取自相关问题中接受的答案(:

vector<bool> v = {true, false, false, true};
for (auto& x : v)
x = !x;

在相关问题中,公认的答案指出,要就地修改向量的分量,我们必须使用

for (auto&& x : v)
x = !x;

但如果我只是这样做:

for (auto x : v)
x = !x;

这将产生相同的结果。那么不需要&&吗?

另外为什么以下 2 个代码不修改组件?

for (bool &&x : v)
x = !x;

for (bool x : v)
x = !x;

TL;DR:代理对象知道如何读取和写入单个位,无论您如何保存它。将代理对象转换为bool会丢失该信息。


for (auto&& x : v)
x = !x;

for (auto x : v)
x = !x;

具有相同的行为,因为在每种情况下,从取消引用std::vector<bool>::iterator获得的代理对象(std::vector<bool>::reference(都存储在x中。代理对象是按值还是按引用存储并不重要 - 它修改代理位的行为是相同的。

for (bool &&x : v)
x = !x;

for (bool x : v)
x = !x;

代理对象被隐式转换为bool。这必然会丢失影响压缩位所需的信息(从而丢失能力(。

请注意,这些都是实现定义的。您的实现也可以放弃空间优化,在这种情况下,您看到的行为可能会有所不同。只有auto&&在每种情况下都有效。

最新更新