为什么const方法不能返回非const引用?

kdo*_*dog 3 c++ const reference const-cast c++11

为什么getRanks()下面的方法不能编译,我怎样才能优雅地修复它?

我想做的就是定义一个成员访问器方法,该方法返回对成员的引用.引用不是const因为我可能会修改它后面引用的内容.但由于成员方法不修改对象,我声明它const.然后编译器(clang,std = c ++ 11)坚持存在"删除限定符"的"引用绑定".但是我不会放弃预选赛,是吗?如果我是,为什么:

struct teststruct{
  vector<int> ranks;
  vector<int>& getRanks()const{
    return ranks;
  }
};
Run Code Online (Sandbox Code Playgroud)

现在,代码编译,如果我更改return语句抛弃const:

return const_cast<vector<int>&>(ranks);
Run Code Online (Sandbox Code Playgroud)

但是"排名"首先不应该是const,我不明白为什么我需要const_cast the const.我甚至不知道这样做是否安全.

无论如何,是否有更清洁的人来编写这种方法?有人可以解释为什么这种简单的常识方法失败了吗?我想声明getRanks()方法" const",以便我可以从其他const方法调用它.

R S*_*ahu 7

const成员函数背后的想法是你应该能够在const对象上调用它们.const函数无法修改对象.

说你上课了

class A
{
   int data;
   void foo() const
   {
   }
};
Run Code Online (Sandbox Code Playgroud)

以及对象和函数调用:

A const a;
a.foo();
Run Code Online (Sandbox Code Playgroud)

在里面A::foo,this->data被视为它的类型int const,而不是int.因此,你不能修改this->dataA:foo().

在你的例子中,this->ranksin 的类型getRanks()被认为是const vector<int>和不vector<int>.由于不允许自动转换为const vector<int>to vector<int>&,因此当您将函数定义为时,编译器会抱怨:

vector<int>& getRanks()const{
    return ranks;
  }
Run Code Online (Sandbox Code Playgroud)

如果将函数定义为以下函数,则不会抱怨:

const vector<int>& getRanks()const{
    return ranks;
  }
Run Code Online (Sandbox Code Playgroud)

因为const vector<int>可以自动转换为const vector<int>&.