c++ 中的 range-for 会调用项的复制构造函数吗?

Will range-for in c++ calls item's copy constructor?

本文关键字:复制 构造函数 中的 range-for 调用 c++      更新时间:2023-10-16

PanelItem是一个没有复制构造函数(=Deleted(的类。我用QList<PanelItem> m_arrPanelItems来存储它们。

当我调用QList::append(const T &value)时,'PanelItem::PanelItem(const PanelItem &)': attempting to reference a deleted function发生错误。我认为它在函数内部调用PanelItem::PanelItem(const PanelItem &)

当我使用range-for时,错误再次出现。我在range_declaration中使用const auto&。所以我认为不会使用复制构造函数PanelItem::PanelItem(const PanelItem &)

// QList<PanelItem> m_arrPanelItems
for (const auto& t_item : this->m_arrpPanelItems) {
// do something 
}

为什么?

QList::append(const T &value)"在列表末尾插入值"。 - 从签名及其功能来看,应该很明显T需要一个复制构造函数才能使此函数工作......

正如thuga已经指出的那样,要存储在例如QList必须是可分配的类型 - 这意味着它们需要有一个复制构造函数 - 才能成为要放入QList的有效类型。对于没有复制构造函数(和/或赋值运算符(的类型,API 甚至声明您需要存储指针(T*(。

即使您以某种方式设法将没有复制构造函数的类型放入QList,您也违反了该要求,从而导致各种未定义的行为: 例如,范围声明中的错误可能源于QList正在做的某种内部魔术(例如,它是一个隐式共享类型(,但这都是没有意义的, 因为您首先不允许将没有复制构造函数的类型放入QList中。换句话说:垃圾进,垃圾出。