从 const 方法返回一对向量迭代器
Posted
技术标签:
【中文标题】从 const 方法返回一对向量迭代器【英文标题】:Return pair of vector iterators from a const method 【发布时间】: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<double>
开头和结尾的指针,允许用户编辑向量中的值。 AFAIK 这不超出const
的范围吗?
这个类看起来像这样:
class Matrix
int height_;
int width_;
vector<double> values_;
当我删除 const
时,错误消失了。
【问题讨论】:
成员是const
在const
方法中,因此values_.begin()
返回const_iterator
,而不是iterator
。
感谢您的回答@mch。另一个问题: const 方法总是返回 const 值吗?我知道这个方法不应该改变this
,但是调用者呢?
@matthiasbe 不,但是在这样的函数中访问成员是const
,并且“const”向量不能公开iterator
,只能公开const_iterator
。所以这不是一般规则,但你会经常遇到这种模式。这确实是为了保护对象不仅不受函数本身的影响,而且不受调用者的影响。
@mch 请不要在 cmets 中回答
【参考方案1】:
一个 const 函数不能改变类的状态,所以它只能返回一个 const_iterator。
如果它返回一个非常量迭代器,其副作用是允许外部范围(调用代码)改变类的状态。这意味着 const 函数允许修改类的状态,即使它是间接的(即不在该函数的范围内发生)。
这违反了 const 关键字所暗示的约定。
【讨论】:
以上是关于从 const 方法返回一对向量迭代器的主要内容,如果未能解决你的问题,请参考以下文章