不能让一个“非const的范围”一个const成员函数
在这里面的代码:不能让一个“非const的范围”一个const成员函数
int main(int argc, char *argv[])
{
class Bar {
public:
int bar;
};
class Foo {
public:
std::vector<Bar> myBars;
Bar &getOneBar() const {
for(Bar &bar : myBars) {
return bar;
}
}
};
}
我得到一个编译错误:
error: binding ‘const main(int, char**)::Bar’ to reference of type ‘main(int, char**)::Bar&’ discards qualifiers
这我接受,但不要”不明白,因为我没有修改该函数中类的内容。我明白我可以在调用getOneBar()之后修改对象,但不能在里面。
我有一个const_cast会得到解决,但我有点不喜欢这样。
Bar &getOneBar() const {
for(Bar &bar : myBars) {
return const_cast<Bar &>(bar);
}
}
I understand that I could modify the object after the call to getOneBar(), but not inside.
这只是不允许的。更确切地说,const
成员函数中的数据成员被认为是const
。然后myBars
变得const std::vector<Bar>
,并返回元素从它变得太const
;它不匹配的返回类型Bar &
,你不能到非const的引用绑定到const
。
正如你所说,const_cast
是一个坏主意。更清晰的方式应该是声明const
和非const
成员函数过载,例如
const Bar& getOneBar() const {
for (const Bar &bar : myBars) {
return bar;
}
}
Bar& getOneBar() {
for (Bar &bar : myBars) {
return bar;
}
}
我@songyuanyao同意,但我不明白的是,为什么我一定会输当我使用第二个重载时,如果我唯一想要的是找到一个栏,并且该操作不会更改我的对象,则第一次重载的const优化。 –
@Santilín返回一个可能被修改的引用只会使'const'成员函数产生矛盾和混乱,这是没有意义的。 – songyuanyao
对于(Bar const&bar:myBars)'不会比铸造好吗? (和返回从'const'功能的非const引用似乎很奇怪我。) –
这没有什么区别,我得到同样的错误 –