C ++与参考成员的const正确性

时间:2018-01-20 22:13:51

标签: c++ class const

我在一个类中有一个fstream &成员,我在类的const函数中调用seekg函数,然后代码编译。我查了一下,seekg没有被宣布为const(也不应该),所以这是怎么回事?

这是我的代码:

class Test {
    fstream &f;
public:
    Test(fstream &f_): f(f_) {}
    int fid() const {
        f.seekg(5);
        return 0;
    }
};

2 个答案:

答案 0 :(得分:1)

事实证明,const不适用于指针或引用的成员,如here所述。

我已经看到的最好的解释是here,其中指出const成员函数内部thisconst T *,其中{{1}是类。

在您的示例中,这表示T上的所有const修饰符都是将fid()this更改为函数内的Test *。当您撰写const Test *时,会将其作为f.类型this->f.进行访问。引用是const但它引用的不是,所以调用一个修改它的函数不会导致任何问题。

答案 1 :(得分:0)

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

  

如果声明E2具有类型“引用T”,则E1.E2是左值; E1.E2的类型是T. [...]

在实践中,你应该考虑对T的引用,作为带有自动解引用的T的const指针。 Internaly这是什么参考。在标准内部,适用于引用的所有规则(例如,参见[basic.life])是那些适用于const指针的规则:

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