1
#include "iostream"
#include "vector"

class ABC {

};

class VecTest {

  std::vector<ABC> vec;

  public:

  std::vector<ABC> & getVec() const { //Here it errors out
      return vec;
  }

};

删除 const 修复它,不是 getVec 是一个常量方法的情况。那么为什么不允许这样做呢?

4

5 回答 5

10

您可能应该做的是返回一个 const 引用。

const std::vector& getVec() const { return vec; }

这是不允许的,因为您说过 getVec 是一个 const 方法,这意味着该方法不应以任何方式更改this对象。返回非常量引用可能会允许更改其对象,因此编译器不允许这样做。

于 2009-01-29T04:42:07.350 回答
4

如果一个方法是 const ,那么它向编译器保证,对象的状态不能通过调用该方法来改变。

如果该方法返回对内部成员的引用,则该方法的用户可以通过该引用间接更改对象的状态。

所以实际上 const 方法不能返回引用(因为它允许间接更改对象的状态)。您可以做的是返回一个 const 引用。从而允许用户访问内部成员但维护成本合约。

例子:

class X
{
    int&       getX();       // get a reference to X
    int const& getX() const; // get a reference to X BUT the interface guarantees
                             // the object will not change state.
    private:
        int x;
}; 

另一种看待它的方式。
如果你有一个 const 对象。您允许调用 const 方法。如果通过调用 const 方法可以检索对对象内部成员的引用,则可以更改其状态。这将违反原始对象的 const(ness)。

于 2009-01-29T04:54:26.110 回答
2

的返回类型getVec()需要是const std::vector<ABC>&.

于 2009-01-29T04:42:02.047 回答
1

补充一下已经说过的内容,当您创建一个 const 方法时,它获得的对象实例(this指针)本质上变成了 const。请记住,当您返回时vec,您是在隐式返回this->vec

return this->vec; // it's a const std::vector<ABC> since "this" is const

“常量”不能被带走——除非你明确地用const_cast<>.

// to illustrate what's happening when you're returning from the function
std::vector<ABC> &return = this->vec; // can't assign const to non-const!

因此,您的返回类型也必须是 const:

const std::vector<ABC> &return = this->vec; // all is good
于 2009-01-29T05:10:56.793 回答
0

为了补充Ray Hidayat所说的,一个 const 方法只能对类成员进行 const 访问。您正在尝试返回对 const 成员变量的非常量引用,因此它失败了。

如果您确实需要从 const 函数访问成员变量的可修改版本,则可以将变量声明为 mutable。不过,我不会推荐它。

于 2009-01-29T04:57:00.473 回答