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

标签 c++ c++11 reference constants const-cast

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

相关文章:

c - 尝试访问函数外部的结构变量后出现段错误

c++ - cpp中的字符串引用处理

C++(.cpp 文件和 .h 文件。)拆分代码并添加一个函数,提取 - 容易吗?

c++ - 这个字符串赋值有什么问题?

c++ - 为什么编译器不为返回类型为 classname& 的函数返回 this 指针而抛出错误

c++ - 运行时检查失败 #3 变量 'i1' 被使用而没有被初始化

java - 使用节点数组的 this$10 树

c++ - SingleLinkedList 的析构函数导致段错误

c++ - map::count 后跟 map::operator[] 的效率

c++ - 找不到小内存泄漏的来源