为什么下面的方法 getRanks()
无法编译,我该如何优雅地修复它?
我想要做的就是定义一个返回对成员的引用的成员访问器方法。该引用不是 const
,因为我稍后可能会修改它引用的内容。但是由于成员方法不修改对象,所以我将其声明为const
。编译器(clang,std=c++11)然后坚持认为有一个“删除限定符”的“引用绑定(bind)”。但我不会放弃预选赛,对吧?如果我是,为什么:
struct teststruct{
vector<int> ranks;
vector<int>& getRanks()const{
return ranks;
}
};
现在,如果我更改 return 语句以丢弃 const,代码将编译:
return const_cast<vector<int>&>(ranks);
但是“ranks”首先不应该是 const,我不明白为什么我需要将 const const_cast 掉。我什至不知道这样做是否安全。
无论如何,有没有更干净的方法来编写这个方法?有人可以解释为什么这种简单的常识性方法会失败吗?我确实想声明 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->ranks
的类型在getRanks()
被视为const vector<int>
而不是 vector<int>
.因为,const vector<int>
的自动转换至 vector<int>&
不允许,编译器会在您将函数定义为:
vector<int>& getRanks()const{
return ranks;
}
如果您将函数定义为:
const vector<int>& getRanks()const{
return ranks;
}
自 const vector<int>
可以自动转换为const vector<int>&
.
关于c++ - 为什么 const 方法不能返回非常量引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55599864/