问题描述
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[]返回了什么。
它返回对 QVector
元素的引用。
现在,当您使用 &
时,您正在捕获对矢量项的引用。
现在 QVector<int>()
是一个临时对象,其活动范围仅限于该行。
所以就在分号之后,vector 被销毁并且引用指向 vector 的不存在元素(因为 vector 不再存在)。
这会导致未定义的行为,而您的运气不好并没有导致应用程序崩溃。
修复它的一种方法是不使用临时对象。
QVector v;
v << 1;
auto value1 = v[0];
auto &value2 = v[0];
const auto value3 = v[0];
const auto& value4 = v[0];
现在所有引用都指向仍然存在的值。