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;
  }
};
现在,代码编译,如果我更改return语句抛弃const:
return const_cast<vector<int>&>(ranks);
但是"排名"首先不应该是const,我不明白为什么我需要const_cast the const.我甚至不知道这样做是否安全.
无论如何,是否有更清洁的人来编写这种方法?有人可以解释为什么这种简单的常识方法失败了吗?我想声明getRanks()方法" const",以便我可以从其他const方法调用它.
const成员函数背后的想法是你应该能够在const对象上调用它们.const函数无法修改对象.
说你上课了
class A
{
   int data;
   void foo() const
   {
   }
};
以及对象和函数调用:
A const a;
a.foo();
在里面A::foo,this->data被视为它的类型int const,而不是int.因此,你不能修改this->data在A:foo().
在你的例子中,this->ranksin 的类型getRanks()被认为是const vector<int>和不vector<int>.由于不允许自动转换为const vector<int>to vector<int>&,因此当您将函数定义为时,编译器会抱怨:
vector<int>& getRanks()const{
    return ranks;
  }
如果将函数定义为以下函数,则不会抱怨:
const vector<int>& getRanks()const{
    return ranks;
  }
因为const vector<int>可以自动转换为const vector<int>&.
| 归档时间: | 
 | 
| 查看次数: | 2840 次 | 
| 最近记录: |