从常数函数返回引用
#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引用可能会允许更改其对象,因此编译器不允许它。
返回类型getVec()
需要为const std::vector<ABC>&
。
如果一个方法是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方法,您可以检索对象的内部成员的引用,您可以更改其状态。这会违反原始对象的常量(ness)。
要添加到什么Ray Hidayat说,const方法只有类成员的const访问。你试图将一个非const引用返回给一个const成员变量,所以它失败了。
如果您确实需要从const函数访问可修改版本的成员变量,则可以声明变量mutable。但我不会推荐它。
要添加到已经说过的内容中,当您创建一个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