我有一个叫ConstVector的类,它仅定义cbegin/cend而不是begin/end,因为我不想在构造后对其成员进行修改。我试图像这样使用基于范围的for循环:

ConstVector const_vector(1, 2, 3);
for(const auto &x : const_vector)
....

该类的相关部分如下所示:
template<class T>
class ConstVector
{
    public:
        ConstVector(std::initializer_list<T> values);
        typename std::vector<T>::const_iterator cbegin(void) const;
        typename std::vector<T>::const_iterator cend(void) const;

    private:
        std::vector<T> data;
};

template<class T>
ConstVector::ConstVector(std::initializer_list<T> values)
    : data(values)
{
}

template<class T>
typename std::vector<T>::const_iterator ConstVector<T>::cbegin() const
{
    return this->data.cbegin();
}

template<class T>
typename std::vector<T>::const_iterator ConstVector<T>::cend() const
{
    return this->data.cend();
}

但是我的编译器提示:
‘begin’ was not declared in this scope

我的问题是:我必须执行开始/结束吗?据我了解,如果它是const auto &x而不是auto &x,则应该选择cbegin/cend。至少那对我有意义。如果删除基于for循环的范围,则一切都可以正常编译。

我还尝试了几乎所有建议将here设置为const的内容,但这没有帮助。

最佳答案



是。



这不是在标准中定义基于范围的for的方式。基于范围的for始终会寻找begin()end()。从https://timsong-cpp.github.io/cppwp/n3337/stmt.ranged

07-24 09:45
查看更多