QVector returns 的 operator[] 值不正确

operator[] of QVector returns incorrect value

QVectoroperator=有4个例子:

auto value1 = (QVector<int>() << 1)[0]; //value is 1 (correct)
auto &value2 = (QVector<int>() << 1)[0]; //value is -572662307 (incorrect)
const auto value3 = (QVector<int>() << 1)[0]; //value is 1 (correct)
const auto& value4 = (QVector<int>() << 1)[0]; //value is -572662307 (incorrect)

那么,你能更清楚地解释这些例子吗?据我所知,它是关于“深层复制”的,它是由 operator= 之一创建的,但对我来说并不完全清楚。

深拷贝与此无关。 QVector 的写时复制机制(这与“深层复制”相关)对您来说是完全透明的,不会影响您的场景。现在忽略此功能。

首先看看QVector::operator[]返回了什么。 它 returns 引用 QVector.

的元素

现在,当您使用 & 时,您正在捕获对向量项的引用。

现在 QVector<int>() 是一个临时对象,其活动范围仅限于该行。 所以就在分号之后,vector 被销毁并且引用指向 none vector 的现有元素(因为 vector 不再存在)。

这会导致未定义的行为,而你的坏运气并没有导致应用程序崩溃。

修复它的一种方法是不使用临时对象。

   QVector v;
   v << 1;
   auto value1 = v[0];
   auto &value2 = v[0];
   const auto value3 = v[0];
   const auto& value4 = v[0]; 

现在所有引用都指向仍然存在的值。