在此代码中:
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);
}
}
答案 0 :(得分:3)
据我所知,我可以在调用getOneBar()之后修改对象,但不能在内部修改。
这是不允许的。更准确地说,数据成员在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;
}
}