在下面代码的main()函数中的for循环中,即使在循环中使用const auto&时,也可以更改变量ab中的变量。有什么办法可以避免这种情况吗?
#include <functional>
#include <iostream>
#include <vector>
#include <string>
#include <boost/iterator/zip_iterator.hpp>
#include <boost/tuple/tuple.hpp>
using namespace std;
struct MyClass {
std::vector<int> a{11, 21, 41};
std::vector<int> b{1, 2, 4};
typedef boost::zip_iterator<boost::tuple<std::vector<int>::const_iterator, std::vector<int>::const_iterator>> const_iterator;
typedef boost::zip_iterator<boost::tuple<std::vector<int>::iterator, std::vector<int>::iterator>> iterator;
const_iterator begin() const {
return const_iterator(boost::make_tuple(a.cbegin(), b.cbegin()));
}
const_iterator end() const {
return const_iterator(boost::make_tuple(a.cend(), b.cend()));
}
iterator begin() {
return iterator(boost::make_tuple(a.begin(), b.begin()));
}
iterator end() {
return iterator(boost::make_tuple(a.end(), b.end()));
}
};
int main(int argc, char** argv)
{
MyClass myc;
for (const auto &ab: myc)
ab.get<0>() = 66;
return 0;
}发布于 2017-09-13 14:03:56
如果您迭代一个const MyClass,那么您将得到您想要的编译错误:
for (const auto &ab: const_cast<MyClass const&>(myc))
ab.get<0>() = 66;您可以使用std::as_const而不是const_cast
for (const auto &ab: std::as_const(myc))
ab.get<0>() = 66;这是因为begin和end的zip_iterator重载将被调用,并且它们返回zip_iterator的const迭代器。
发布于 2017-09-13 14:05:55
您的问题是myc不是const,所以您正在使用myc::iterator而不是myc::const_iterator来迭代它。
然后将ab绑定到通过该迭代器进行间接定向的结果。ab.get<0>()将是一个const方法(因为它不改变ab),但是它返回一个非const的引用。
解决方案是使用std::as_const(myc) (在ab声明中甚至不需要const )。
for (auto &ab: std::as_const(myc))
ab.get<0>() = 66; // Error. Cannot write to const object.https://stackoverflow.com/questions/46199343
复制相似问题