返回 '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 它作为非常量引用的尝试失败了。

问题

这里的问题是 getconst 合格的,因此它只能 return 对其成员对象之一的 const 引用。如果你想 return 一个非常量引用,那么你必须使 getconst 合格。

如果从 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;
};