c++ - 返回数组元素时非常量引用的无效初始化

标签 c++

我正在编写一个包装动态分配数组的类,并且我正在尝试编写 operator[] 函数。目前我有:

bool& solution::operator[](unsigned int pos)
{
  if(pos < _size)
  {
    return this->_data[pos];
  }
  else
  {
    return false;
  }
}

但是我从 g++ 得到以下错误:

错误:从“bool”类型的右值对“bool&”类型的非常量引用进行无效初始化

我应该怎么做?我需要 [] 运算符才能修改元素。

最佳答案

这是因为作为右值的 bool 字面量false 不能绑定(bind)到非常量引用 bool& ,它是 operator[]< 的返回类型.

只需将返回类型从bool&更改为bool,错误就会消失。但这并不能解决你的问题,正如你所说,你想返回元素的 reference ,以便可以在调用站点上更改元素,那么你必须这样做:

//correct solution
bool& solution::operator[](unsigned int pos)
{
  if(pos > _size)
     throw std::out_of_range("invalid index");
  return this->_data[pos];
}

也就是说,你应该通知调用者一个无效的索引,这样它就可以知道出了什么问题。 C++ 各种 exception classes是否正是为了这个目的,即通知错误。

尝试在索引无效时返回任何值(false 或 true),只会隐藏问题。问问自己,如果返回一个 dummy bool 值(存储在类中),那么调用者会知道索引是否无效吗?没有。

//incorrect solution
bool& solution::operator[](unsigned int pos)
{
  if(pos > _size)
     return _dummy; //it hides the problem, no matter if its true or false!
  return this->_data[pos];
}

关于c++ - 返回数组元素时非常量引用的无效初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7376985/

相关文章:

c++ - 为什么在 WndProc 中转换不正确?

c++ - 笨拙的 DLL 导出部分

c++ - 使用 ios::ate 写入 ofstream 会覆盖现有文件

c++ - 将 X 坐标从一种分辨率转换为另一种分辨率

c++ - 使用宏获取函数指针的函数名称 # 不起作用

c++ - 如何将 pcre_study 与 pcrecpp 一起使用?

c++ - 使用 OLE 删除 excel 文档中的冒号过滤器

c++ - 返回 CStringArray 给出错误

c++ - C++合并文件的问题

C++ 控制台不显示菜单