我在一个类中有一个fstream &
成员,我在类的const函数中调用seekg
函数,然后代码编译。我查了一下,seekg
没有被宣布为const
(也不应该),所以这是怎么回事?
这是我的代码:
class Test {
fstream &f;
public:
Test(fstream &f_): f(f_) {}
int fid() const {
f.seekg(5);
return 0;
}
};
答案 0 :(得分:1)
事实证明,const
不适用于指针或引用的成员,如here所述。
我已经看到的最好的解释是here,其中指出const
成员函数内部this
是const 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;
}
};