不能为范围制作非常数'在const成员函数中

时间:2017-10-17 03:59:43

标签: c++ for-loop 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);
        }
      }

1 个答案:

答案 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;
    }
}