#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是常量方法的情况。那为什么不允许这样做?
答案 0 :(得分:10)
你应该做的是返回一个const引用。
const std :: vector&amp; getVec()const {return vec; }
这是不允许的,因为你说getVec是一个const方法,这意味着该方法不应该以任何方式改变 this 对象。返回非const引用可能允许更改其对象,因此编译器不允许它。
答案 1 :(得分: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)。
答案 2 :(得分:2)
getVec()
的返回类型必须为const std::vector<ABC>&
。
答案 3 :(得分:1)
要添加已经说过的内容,当你创建一个方法const时,它获得的对象实例(this
指针)基本上变成了const。请注意,当您返回vec
时,您隐式返回this->vec
:
return this->vec; // it's a const std::vector<ABC> since "this" is const
“Constness”不能被删除 - 除非您使用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
答案 4 :(得分:0)
要添加Ray Hidayat所说的内容,const方法只能访问类成员。你试图将一个非const引用返回给const成员变量,所以它失败了。
如果您确实需要从const函数访问成员变量的可修改版本,则可以声明变量mutable。不过我不推荐它。