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

Sha*_*gor 9 c++

我有一个类,我们称之为ConstVector,它只定义cbegin/cend而不是begin/end,因为我不想在构造之后允许对其成员进行修改.我尝试使用基于for循环的范围,如下所示:

ConstVector const_vector(1, 2, 3);
for(const auto &x : const_vector)
....
Run Code Online (Sandbox Code Playgroud)

虽然该课程的相关部分如下所示:

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();
}
Run Code Online (Sandbox Code Playgroud)

但我的编译器抱怨:

‘begin’ was not declared in this scope
Run Code Online (Sandbox Code Playgroud)

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

我也尝试过这里提出的所有内容const,但这并没有帮助.

R S*_*ahu 9

我必须实现开始/结束吗?

是.

据我所知,它应该选择cbegin/cend是否const auto &x存在auto &x.

这不是for标准中基于范围的定义.基于范围for总是寻找begin()end().来自https://timsong-cpp.github.io/cppwp/n3337/stmt.ranged.

否则,开始-EXPR最终EXPRbegin(__range)end(__range)表示,其中beginend被查找与参数相关的查找([basic.lookup.argdep]).出于此名称查找的目的,名称空间std是关联的名称空间.