返回' const'之间的区别或非const引用

时间:2016-02-01 16:38:55

标签: c++ c++11 reference const pass-by-reference

我有一个列表作为成员的类,以及此列表中的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;

的表达式

2 个答案:

答案 0 :(得分:4)

问题是函数get被声明为const

const std::list<int*>& get() const
                          // ^

,因此list被视为函数内的const

因此,尝试将其作为非const引用返回失败。

答案 1 :(得分:1)

问题

这里的问题是getconst限定的,因此它只能返回const对其成员对象之一的引用。如果您想要返回非const引用,则必须使getconst - 合格。

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