cbegin / cend对于基于循环的范围是不够的?

时间:2017-06-02 15:06:19

标签: c++

我有一个课程,我们称之为ConstVector,它只定义cbegin / cend而不是开始/结束,因为我不想在构建之后允许对其成员进行修改。我试着像这样使用基于范围的循环:

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

我的问题是:我是否必须实施开始/结束?据我了解,它应该选择cbegin / cend,如果它是const auto &x而不是auto &x。至少对我来说有什么意义。如果我删除基于for循环的范围,一切都编译得很好。

我还尝试了所有建议here的所有内容const,但这并没有帮助。

1 个答案:

答案 0 :(得分:8)

  

我是否必须实施开始/结束?

  

据我所知,它应该选择cbegin/cend const auto &x而不是auto &x

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

  

否则, begin-expr end-expr 分别为begin(__range)end(__range),其中begin和{{用参数依赖查找([basic.lookup.argdep])查找1}}。出于此名称查找的目的,namespace std是一个关联的命名空间。