返回 'const' 或非常量引用之间的区别
Difference between returning 'const' or non-const reference
我有一个 class,其中有一个列表作为成员,还有一个 getter 在这个列表中:
class A
{
public:
const std::list<int*>& get() const {
return list;
}
private:
std::list<int*> list;
};
为什么 get 函数必须 return 一个 const std::list
而不仅仅是一个 std::list
?
否则我会得到这个错误:
error: invalid initialization of reference of type 'std::list&'
from expression of type 'const std::list'
问题是函数 get
声明为 const
:
const std::list<int*>& get() const
// ^
,所以list
被认为是函数内部的const
。
因此 return 它作为非常量引用的尝试失败了。
问题
这里的问题是 get
是 const
合格的,因此它只能 return 对其成员对象之一的 const
引用。如果你想 return 一个非常量引用,那么你必须使 get
非 const
合格。
如果从 const 正确性的角度考虑这也是有意义的:如果允许 return 从 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; }
此时可能值得考虑只列出列表 public,具体取决于上下文:
struct A {
std::list<int*> list;
};
我有一个 class,其中有一个列表作为成员,还有一个 getter 在这个列表中:
class A
{
public:
const std::list<int*>& get() const {
return list;
}
private:
std::list<int*> list;
};
为什么 get 函数必须 return 一个 const std::list
而不仅仅是一个 std::list
?
否则我会得到这个错误:
error: invalid initialization of reference of type 'std::list&' from expression of type 'const std::list'
问题是函数 get
声明为 const
:
const std::list<int*>& get() const
// ^
,所以list
被认为是函数内部的const
。
因此 return 它作为非常量引用的尝试失败了。
问题
这里的问题是 get
是 const
合格的,因此它只能 return 对其成员对象之一的 const
引用。如果你想 return 一个非常量引用,那么你必须使 get
非 const
合格。
如果从 const 正确性的角度考虑这也是有意义的:如果允许 return 从 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; }
此时可能值得考虑只列出列表 public,具体取决于上下文:
struct A {
std::list<int*> list;
};