【问题标题】:return reference in [] operator of std::vector在 std::vector 的 [] 运算符中返回引用
【发布时间】:2021-08-16 12:39:09
【问题描述】:

请考虑这种情况。 我正在为 [] 运算符创建一个函数,就像在 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;
}

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

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

vector[100] = 1;

int answer = vector[100];

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

else部分应该返回什么?

【问题讨论】:

  • "这个函数的返回类型是 'T'" 不是T&amp; 吗?实际上从代码看起来它是T*
  • 你为什么要返回指针?
  • 我怀疑,像您之前的许多人一样,您将“地址”与符号与“引用类型”符号混淆了。
  • @nhatnq 你可以扔掉。 “应该”在很多情况下都是错误的

标签: c++ vector std


【解决方案1】:

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

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

你必须写

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

要得到你想要的,你应该返回一个引用而不是一个指针。即返回类型应该是T&amp; 而不是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&amp;T&amp;

【讨论】:

    猜你喜欢
    • 2013-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-19
    • 2018-12-16
    相关资源
    最近更新 更多