Iam*_*non 4 c++ for-loop boolean vector
std::vector<bool> 使用代理迭代器。
因此,以下代码将无法编译(代码取自相关问题中已接受的答案):
vector<bool> v = {true, false, false, true};
for (auto& x : v)
x = !x;
Run Code Online (Sandbox Code Playgroud)
在相关问题中,已接受的答案指出,要就地修改向量的分量,我们必须使用
for (auto&& x : v)
x = !x;
Run Code Online (Sandbox Code Playgroud)
但如果我只是这样做:
for (auto x : v)
x = !x;
Run Code Online (Sandbox Code Playgroud)
这会产生相同的结果。那么&&不需要吗?
进一步为什么以下2个代码不修改组件?
for (bool &&x : v)
x = !x;
Run Code Online (Sandbox Code Playgroud)
和
for (bool x : v)
x = !x;
Run Code Online (Sandbox Code Playgroud)
TL;DR:代理对象知道如何读取和写入单个位,而不管您如何保留它。将代理对象转换为bool会丢失该信息。
for (auto&& x : v)
x = !x;
Run Code Online (Sandbox Code Playgroud)
和
for (auto x : v)
x = !x;
Run Code Online (Sandbox Code Playgroud)
具有相同的行为,因为在每种情况下,std::vector<bool>::reference从取消引用 a 获得的代理对象 ( )std::vector<bool>::iterator都存储在x. 代理对象是按值存储还是按引用存储并不重要——它修改代理位的行为是相同的。
在
for (bool &&x : v)
x = !x;
Run Code Online (Sandbox Code Playgroud)
和
for (bool x : v)
x = !x;
Run Code Online (Sandbox Code Playgroud)
代理对象被隐式转换为bool. 这必然会丢失影响压缩位所需的信息(以及因此的能力)。
请注意,这些都是实现定义的。您的实现也可以放弃空间优化,在这种情况下,您看到的行为可能会有所不同。只auto&&适用于所有情况。