【问题标题】:Return pair of vector iterators from a const method从 const 方法返回一对向量迭代器
【发布时间】:2020-07-17 08:54:19
【问题描述】:

我尝试从 const 方法返回一对向量迭代器。

pair<vector<double>::iterator, vector<double>::iterator> Matrix::GetColumn(int j) const {
  return pair<vector<double>::iterator, vector<double>::iterator>(values_.begin() + j * height_,
                                                                  values_.begin() + (j + 1) * height_);
}

我在编译时收到以下错误

matrix.cc:119:133: error: no matching function for call to ‘std::pair<__gnu_cxx::__normal_iterator<double*, std::vector<double> >, __gnu_cxx::__normal_iterator<double*, std::vector<double> > >::pair(__gnu_cxx::__normal_iterator<const double*, std::vector<double> >, __gnu_cxx::__normal_iterator<const double*, std::vector<double> >)’
   return pair<vector<double>::iterator, vector<double>::iterator>(values_.begin() + j * height_, values_.begin() + (j + 1) * height_);
                                                                                                                                     ^

迭代器是指向vector&lt;double&gt; 开头和结尾的指针,允许用户编辑向量中的值。 AFAIK 这不超出const 的范围吗?

这个类看起来像这样:

class Matrix {
    int height_;
    int width_;
    vector<double> values_;
}

当我删除 const 时,错误消失了。

【问题讨论】:

  • 成员是constconst 方法中,因此values_.begin() 返回const_iterator,而不是iterator
  • 感谢您的回答@mch。另一个问题: const 方法总是返回 const 值吗?我知道这个方法不应该改变this,但是调用者呢?
  • @matthiasbe 不,但是在这样的函数中访问成员是const,并且“const”向量不能公开iterator,只能公开const_iterator。所以这不是一般规则,但你会经常遇到这种模式。这确实是为了保护对象不仅不受函数本身的影响,而且不受调用者的影响。
  • @mch 请不要在 cmets 中回答

标签: c++ class vector


【解决方案1】:

一个 const 函数不能改变类的状态,所以它只能返回一个 const_iterator。

如果它返回一个非常量迭代器,其副作用是允许外部范围(调用代码)改变类的状态。这意味着 const 函数允许修改类的状态,即使它是间接的(即不在该函数的范围内发生)。

这违反了 const 关键字所暗示的约定。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-26
    • 2013-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-10
    相关资源
    最近更新 更多