【问题标题】:why do we need both const and non-const getters in this example为什么在这个例子中我们需要 const 和非常量 getter
【发布时间】:2009-10-08 11:35:54
【问题描述】:

我遇到了这个例子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 类中需要两个 friend element 函数?

【问题讨论】:

标签: c++


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    vector 本身的 operator[] 也是这样实现的。

    实际上,非常量“getter”也充当“setter”

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 参见 MSalters 的回复:const 版本的参数本身就是 const。如果要使用 const 参数调用函数,则需要 const 版本。
      • @Kristoff - 是的,你的意思是?在给出的示例中不需要 const 版本,就像在 MSalters 示例中不需要非 const 版本一样。
      • 是的,但这应该是通用类,问题特别是关于需要它的情况。
      【解决方案4】:

      这两个函数都返回各个向量的元素,并坚持向量元素的行为。

      即如果向量是 const ==> 它的所有元素都是 const ==> 一个不能修改它的元素并且为具有 const 返回类型和 const 参数的函数定义。 所以它不允许修改vector的元素。

      非常量向量正好相反。可以使用向量的引用来修改向量的元素。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-11-06
        • 1970-01-01
        • 2014-07-20
        • 2022-01-13
        • 2010-11-10
        • 2015-03-24
        • 1970-01-01
        • 2016-03-18
        相关资源
        最近更新 更多