c 11 – 基于范围的for循环与const容器问题

我正在实施Bjarne Stroustrup的“A Tour of C”一书中的一些例子.

我有一个模板函数来计算元素的总和(从书中复制):

template<typename Container, typename Value>
Value sum(const Container& c, Value v)
{   
  for (auto x : c)
    v+=x;
  return v;
}

我想将它应用于模板类Vector(在书中定义),它具有“开始”和“结束”函数以支持范围循环(从书中复制):

   template<typename T>
   T∗ begin(Vector<T>& x)
   {
    return x.size() ? &x[0] : nullptr;
   }
   template<typename T>
   T∗ end(Vector<T>& x)
   {
    return begin(x)+x.size();
   }

当应用于Vector时,例如:

Vector<int> v={1,2,3,4};
int s=sum(v, 0);

这导致编译错误.但是,当我从sum模板函数中删除const时

 template<typename Container, typename Value>
 Value sum( Container& c, Value v)

它汇编.

1-为什么它不能与“const”一起使用?如果是“开始”,“结束”实现的问题,如何实现它们?

最佳答案 这些是开始和结束的唯一版本吗?请注意,他们通过引用非const来获取向量.要进行sum编译,还应该添加const重载:

template<typename T>
const T∗ begin(const Vector<T>& x)
{
  return x.size() ? &x[0] : nullptr;
}

template<typename T>
const T∗ end(const Vector<T>& x)
{
  return begin(x)+x.size();
}

请注意,这需要Vector具有operator []的const重载.这是一个非常合理的要求;如果原始Vector没有它(可疑),你应该添加它.

点赞