首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >增强zip_iterator忽略const正确性

增强zip_iterator忽略const正确性
EN

Stack Overflow用户
提问于 2017-09-13 13:48:12
回答 2查看 98关注 0票数 1

在下面代码的main()函数中的for循环中,即使在循环中使用const auto&时,也可以更改变量ab中的变量。有什么办法可以避免这种情况吗?

代码语言:javascript
复制
#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;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-09-13 14:03:56

如果您迭代一个const MyClass,那么您将得到您想要的编译错误:

代码语言:javascript
复制
for (const auto &ab: const_cast<MyClass const&>(myc))
    ab.get<0>() = 66;

您可以使用std::as_const而不是const_cast

代码语言:javascript
复制
for (const auto &ab: std::as_const(myc))
    ab.get<0>() = 66;

这是因为beginendzip_iterator重载将被调用,并且它们返回zip_iterator的const迭代器。

票数 2
EN

Stack Overflow用户

发布于 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 )。

代码语言:javascript
复制
for (auto &ab: std::as_const(myc))
    ab.get<0>() = 66;  // Error.  Cannot write to const object.
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46199343

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档