[英]return reference in [] operator of std::vector
请考虑这种情况。 我正在为 [] 运算符创建一个 function ,就像在 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;
}
其中参数是传递给 function 的参数。 此 function 的返回类型为“T*”。
我正在寻找读写案例:
vector[100] = 1;
和int answer = vector[100];
这就是为什么它们通过引用返回。
else 部分应该返回什么?
首先,您返回的不是引用,而是指针,这使得该方法不是很有用。 代替
vector[100] = 1;
int answer = vector[100];
你必须写
*vector[100] = 1;
int answer = *vector[100];
为了得到你想要的,你应该返回一个引用而不是一个指针。 即返回类型应该是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&
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.