QVector returns 的 operator[] 值不正确
operator[] of QVector returns incorrect value
QVector
和operator=
有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];
现在所有引用都指向仍然存在的值。
QVector
和operator=
有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];
现在所有引用都指向仍然存在的值。