gpt4 book ai didi

c++ - boost zip_iterator 忽略 const 正确性

转载 作者:行者123 更新时间:2023-11-30 03:28:55 26 4
gpt4 key购买 nike

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

#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;
}

最佳答案

如果你遍历 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;

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

关于c++ - boost zip_iterator 忽略 const 正确性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46199343/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com