【问题标题】:Is cbegin/cend not enough for a range based for loop?对于基于范围的 for 循环,cbegin/cend 是否不够?
【发布时间】:2017-06-02 15:06:19
【问题描述】:

我有一个类,我们称之为 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 &amp;x 而不是auto &amp;x,它应该选择cbegin/cend。至少这对我来说是有意义的。如果我删除基于 for 循环的范围,一切都可以正常编译。

我也尝试了几乎所有建议 here 以使其成为 const,但这并没有帮助。

【问题讨论】:

    标签: c++


    【解决方案1】:

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

    是的。

    据我了解,如果是const auto &amp;x而不是auto &amp;x,应该选择cbegin/cend。

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

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

    【讨论】:

      猜你喜欢
      • 2012-06-05
      • 2016-10-31
      • 1970-01-01
      • 1970-01-01
      • 2014-12-06
      • 2014-01-12
      • 2013-01-04
      • 1970-01-01
      相关资源
      最近更新 更多