为什么在这个例子中我们需要const和非const getter

时间:2009-10-08 11:35:54

标签: c++

我遇到了这个例子here

#include <vector>
#include <cstddef>

template<typename Tag>
class Ref_t {
   std::size_t value;

   friend Tag& element(Ref_t r, std::vector<Tag>& v) {
     return v[r.value];
   }

   friend const Tag& element(Ref_t r, const std::vector<Tag>& v)
   {
     return v[r.value];
   }
public:
   // C'tors, arithmetic operators, assignment

};

struct A{};
struct B{};

typedef Ref_t<A> ARef_t;
typedef Ref_t<B> BRef_t;

int main() {
   std::vector<A> va;
   ARef_t ar;
   A& a = element(ar, va);

}

所以问题是为什么我们在Ref_t类中需要-two friend element个函数?

4 个答案:

答案 0 :(得分:4)

两个函数之间的区别在于非常量向量的element()本身是非常量的,但如果整个向量是常量,那么每个element()也是常量。

int main() {
   std::vector<A> const cva = foo();
   ARef_t ar;
   A const& a = element(ar, cva);
}

答案 1 :(得分:1)

如果持有const向量,则可以读取元素值,但不能更改它们。 如果持有非常量向量,则可以实际更改元素值。 在这两种情况下,您都调用相同的函数 name ,但由于const上的重载,会调用另一个函数。

矢量本身的

operator []也是以这种方式实现的。

实际上,非const“getter”也可以作为“setter”

答案 2 :(得分:0)

你没有,你只需要这个例子中的非const版本

答案 3 :(得分:0)

两个函数都返回粘贴了向量元素行为的相应向量的元素。

即。如果vector是const ==&gt;它的所有元素都是const ==&gt;一个不能修改它的元素,并且对于具有const返回类型的函数,定义了const参数。 所以它不会允许修改vector的元素。

与非常量向量完全相反。可以使用其引用修改向量元素。