我正在编写一个包装动态分配数组的类,并且我正在尝试编写 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/