我遇到了这个例子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
个函数?
答案 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的元素。
与非常量向量完全相反。可以使用其引用修改向量元素。