用于修改非const对象的编译器错误

kal*_*kal -1 c++

 #include "iostream"
 #include "vector"


 class ABC {

  private:
      bool m_b;
  public:
      ABC() : m_b(false) {}

      ABC& setBool(bool b) {
          m_b = b;
          return *this;
      }

      bool getBool() const {
          return m_b;
      }
};

 void foo(const std::vector<ABC> &vec) {

      vec[0].setBool(true);
 }

 int main(int argc, char*argv[]) {

     std::vector<ABC> vecI;
     ABC i;
     vecI.push_back(i);
     foo(vecI);
 }
Run Code Online (Sandbox Code Playgroud)

当我编译它时,我得到这个错误:const ABC作为discards限定符的this参数传递ABC& ABC::setBool(bool)

任何想法为什么会发生这种情况,因为对象本身并不是一个常数.

小智 6

foo通过引用引用vec,你不能改变const.因此要么删除调用setBool的行,要么如果你真的要设置bool,请将参数类型更改为std :: vector&.

或者对实现更加严格......你看,这两个函数存在:

T& vector<T>::operator[](int);  
T const& vector<T>::operator[](int) const;  
Run Code Online (Sandbox Code Playgroud)

当你在const对象上调用"vec [i]"时,只有第二个有效,所以它被选中.但是这个重载显然会返回T const&,这就是你无法改变的事情.