我有一个列表作为成员的类,以及此列表中的getter:
class A
{
public:
const std::list<int*>& get() const {
return list;
}
private:
std::list<int*> list;
};
为什么get函数必须返回const std::list
而不只是std::list
?
否则我收到此错误:
错误:类型&#39; std :: list&amp;&#39;的引用无效初始化 来自类型&const; const std :: list&#39;
的表达式
答案 0 :(得分:4)
问题是函数get
被声明为const
:
const std::list<int*>& get() const
// ^
,因此list
被视为函数内的const
。
因此,尝试将其作为非const引用返回失败。
答案 1 :(得分:1)
这里的问题是get
是const
限定的,因此它只能返回const
对其成员对象之一的引用。如果您想要返回非const引用,则必须使get
非const
- 合格。
如果从const-correctness的角度考虑这一点也是有道理的:如果允许从const限定成员函数返回对成员对象的非const引用,那么可以有效地修改常量对象通过该引用,例如通过:
A const a(...);
std::list<int*> ref = a.get(); // const qualified but returning non const reference
ref.clear(); // wiped out contents of list in `a`
我建议按以下方式提供两种重载:
const std::list<int*>& get() const { return list; }
std::list<int*>& get() { return list; }
此时可能值得考虑将列表公开,具体取决于上下文:
struct A {
std::list<int*> list;
};