强制foreach使用const迭代器

Max*_*Max 7 c++ containers iterator c++11

我有一个实现cbegin()cend()功能的自定义容器类.然后我在foreach循环中使用它,但它似乎需要begin()end()成员函数,即使我尝试使用const修饰符:

for (const auto val: container)
Run Code Online (Sandbox Code Playgroud)

和这样:

for (auto const val: container)
Run Code Online (Sandbox Code Playgroud)

和这样:

for (const auto const val: container)
Run Code Online (Sandbox Code Playgroud)

是否有可能强迫foreach使用常数c函数?

Die*_*ühl 10

当然:使范围看起来好像是一个const范围:

template <typename T>
T const& make_const(T const& argument) {
    return argument;
}

// ...
for (auto&& value: make_const(argument)) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

在所有情况下基于范围的for意愿,但是,使用begin()end()从不cbegin()cend().您可能希望提供以下内容:

template <typename T>
auto begin(my_container<T> const& t) -> decltype(t.cbegin()) {
    return t.cbegin();
}
template <typename T>
auto end(my_container<T> const& t) -> decltype(t.cend()) {
    return t.cend();
}
Run Code Online (Sandbox Code Playgroud)

显然,您希望用my_container合适的容器类型替换.就个人而言,我可能只是提供合适begin()end()成员.


Dav*_*eas 6

我不知道是什么的决定,只提供cbegin()cend()是的,但基于对范围内的那些不被使用.如果你想在一个范围内使用你的容器,你需要提供begin()end()(尽管你可以让它们返回const迭代器)