【问题标题】:Will range-for in c++ calls item's copy constructor?c++ 中的 range-for 会调用项目的复制构造函数吗?
【发布时间】:2023-03-09 14:19:01
【问题描述】:

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 
}

为什么?

【问题讨论】:

标签: c++ qt c++11 for-loop


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2011-07-17
    • 2018-10-17
    • 2013-04-17
    • 1970-01-01
    • 2012-09-20
    • 1970-01-01
    • 2016-12-09
    • 1970-01-01
    相关资源
    最近更新 更多