#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 是一个常量方法的情况。那么为什么不允许这样做呢?
您可能应该做的是返回一个 const 引用。
const std::vector& getVec() const { return vec; }
这是不允许的,因为您说过 getVec 是一个 const 方法,这意味着该方法不应以任何方式更改this对象。返回非常量引用可能会允许更改其对象,因此编译器不允许这样做。
如果一个方法是 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)。
的返回类型getVec()
需要是const std::vector<ABC>&
.
补充一下已经说过的内容,当您创建一个 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
为了补充Ray Hidayat所说的,一个 const 方法只能对类成员进行 const 访问。您正在尝试返回对 const 成员变量的非常量引用,因此它失败了。
如果您确实需要从 const 函数访问成员变量的可修改版本,则可以将变量声明为 mutable。不过,我不会推荐它。