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

return reference in [] operator of 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;
}

其中参数是传递给函数的参数。此函数的 return 类型是 'T*'.

我正在寻找读写案例:

vector[100] = 1;

int answer = vector[100];

这就是为什么它们是 return 通过引用编辑的。

else 部分应该return编辑什么?

首先,你不是return引用,而是一个指针,这使得该方法不是很有用。而不是

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

你必须写

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

要得到你想要的东西,你应该return引用而不是指针。即 return 类型应该是 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");
}

您不能 return 对局部变量的引用,因为一旦方法 returns 和局部变量生命周期结束,该引用就会悬空。

您必须选择更适合的方法。 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 和一个非常量,returning const T&T&,分别。