gpt4 book ai didi

c++ - 为什么 const 方法不能返回非常量引用?

转载 作者:太空宇宙 更新时间:2023-11-04 12:37:48 24 4
gpt4 key购买 nike

为什么下面的方法 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->dataA: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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com