gpt4 book ai didi

c++ - QPointer 可以成为 std::map 的关键吗

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:40:02 25 4
gpt4 key购买 nike

根据 SGI's doc on associative containers ,“由于元素是根据它们的键存储的,因此与每个元素关联的键是不可变的”至关重要。我有时使用指针作为 std::map 的键,因为尽管指向的对象可能是可变的,但指针本身是常量。

QPointer 在技术上是一个模仿指针的对象,并且 Qt's doc说我们可以像使用指针一样使用 QPointer。由于 QPointer 对象本身在执行过程中可能会发生变化,它是否仍然可以用作 std::map 容器的键?

编辑 1:我不能使用 QMap,我必须坚持使用 std::map。
编辑 2:当我使用 QPointer 时代码编译。问题是我是否应该在运行时预料到不愉快的意外。

最佳答案

不,这不安全,因为 QPointer<T> 可能会更改为 NULLQObject被摧毁。 ( QPointer 类似于 std::weak_ptr 。)所以这段代码会产生未定义的行为:

class CopyableWidget : public QWidget {
Q_OBJECT;
public:
CopyableWidget(Widget* parent = 0) : QWidget(parent) {}
CopyableWidget(const CopyableWidget& w, Widget* parent = 0) : QWidget(parent) {}
};

std::vector<CopyableWidget> v(2); // Two default-constructed widgets
std::map<QPointer<CopyableWidget>, int> wid_values;
wid_values[&v[0]] = 1;
wid_values[&v[1]] = 2;
// wid_values contains { {&v[0], 1}, {&v[1], 2} }
v.resize(1);
// The QPointer in wid_values constructed from &v[1] now acts like NULL.
// wid_values contains { {&v[0], 1}, {NULL, 2} }
// But &v[0] > NULL (on most platforms). Class invariant was violated!

关于c++ - QPointer 可以成为 std::map 的关键吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5238437/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com