为何修改vector<bool>元素时迭代需使用&&,而vector<int>无需?
为什么遍历修改vector需要用&&,而vector不用?
这个问题戳中了C++标准库一个容易踩坑的细节——vector
先看vector的正常逻辑
当你遍历vector
vector<int> miv{ 1, 2, 3 }; for (auto &e : miv) { e = 15; } // 合法
这里的auto &e拿到的是容器里实际存储的int元素的左值引用,直接修改e就是直接修改容器里的元素,完全符合我们的直觉,自然没问题。
再看vector的特殊之处
vectoroperator[]和迭代器返回的不是bool&,而是一个代理对象(比如std::vector<bool>::reference)。
这个代理对象是个临时的右值,当你试图用auto &e(左值引用)去绑定它的时候,编译器会报错——左值引用不能绑定到右值上!
为什么auto &&就能解决问题?
auto &&是C++11引入的万能引用,它的特性是可以绑定到任意类型的左值或右值。当它绑定到vector
vector<bool> mbv{ false }; for (auto &&e : mbv) { e = true; } // 合法
额外补充
除了万能引用,你也可以显式指定代理类型来遍历:
for (vector<bool>::reference e : mbv) { e = true; }
但auto &&显然是最简洁优雅的写法。
内容的提问来源于stack exchange,提问作者user3772662
相关产品推荐
相关产品推荐

