在std::vector的[]运算符中返回引用



请考虑这种情况。我正在为[]运算符创建一个函数,就像std::vector中一样,它的内部主体是这样的:

int temp;
if(argument >= 0 && argument < size) {
return &my_vector[i];
} else {
cout << "out of bounds" << endl;
//i need to return here something but this gives me an error: local variable cannot be returned by reference.
return &temp;
}

其中argument是传递给函数的参数。此函数的返回类型为"T*"。

我正在寻找读写两种情况:

vector[100] = 1;

int answer = vector[100];

这就是它们通过引用返回的原因。

其他部分应该返回什么?

首先,返回的不是引用,而是指针,这使得该方法不是很有用。代替

vector[100] = 1;
int answer = vector[100];

你必须写

*vector[100] = 1;
int answer = *vector[100];

要得到您想要的内容,您应该返回一个引用而不是指针。Ie返回类型应为T&,而不是T*

那么你基本上有两种选择。要么模仿矢量operator[]。它不进行任何边界检查。由调用者来确保传递有效的索引:

return my_vector[i];  // thats all (assuming my_vector[i] returns a reference)

另一种选择是像std::vector::at那样抛出异常:

if(i >= 0 && i< size) {
return my_vector[i];
} else {
throw std::out_of_range("invalid index");
}

不能返回对局部变量的引用,因为只要方法返回并且局部变量的生存期结束,该引用就会挂起。

你必须选择哪种方法更适合。std::vector提供两者。通常在循环中调用方法时:

for (size_t i=0; i<size;++i) {
foo[i] = i;
}

您不希望在每次访问时都会产生检查索引的开销。另一方面,有时会计算索引,调用方希望封装边界检查,而不是手动执行:

try {
size_t index = some_function();   // is this a valid index?!?
foo.at(i) = 42;                   // let at check it
} catch(...) {
//...
}

PS:这些访问器通常需要两个重载,一个const和一个非常数,分别返回const T&T&

最新更新