代码之家  ›  专栏  ›  技术社区  ›  forumulator

引用成员的C++常量正确性

  •  2
  • forumulator  · 技术社区  · 8 年前

    我有一个 fstream & 一个类中的成员,我在该类中调用 seekg 类的常量函数中的函数,但代码可以编译。我查过了 seekg 未声明 const (也不应该),那么这是怎么发生的呢?

    这是我的代码:

    class Test {
        fstream &f;
    public:
        Test(fstream &f_): f(f_) {}
        int fid() const {
            f.seekg(5);
            return 0;
        }
    };
    
    2 回复  |  直到 8 年前
        1
  •  2
  •   Heath Raftery    8 年前

    结果是 const 如前所述,不适用于作为指针或引用的成员 here .

    我所看到的最好的解释是 here 里面写着 常量 成员功能, this 是一个 const T * 哪里 T 是班级。

    在您的示例中,这意味着所有 常量 修改器打开 fid() 做的就是改变 来自 Test * 到a const Test * 函数内部。当你写作时 f. ,访问方式为 this->f. 类型为 fstream & const . 引用是const,但它引用的不是,因此调用修改它的函数不会导致任何问题。

        2
  •  0
  •   Oliv    8 年前

    该规则在中定义 [expr.ref]/4 :

    如果E2被声明为具有对T的类型引用,那么E1。E2是左值;E1的类型。E2为T.[…]

    实际上,您应该考虑引用T,作为指向T的常量指针,并自动取消引用。内在地,这就是参考。在标准中,所有适用于引用的规则(例如,请参见[基本生命])都是适用于常量指针的规则:

    class Test {
      fstream * const f;
    public:
      Test(fstream &f_): f(&f_) {}
      int fid() const {
        f->seekg(5);
        return 0;
      }
    };
    
    推荐文章