c++ 中的 range-for 会调用项的复制构造函数吗?
Will range-for in c++ calls item's copy constructor?
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
中。换句话说:垃圾进,垃圾出。
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 当从函数参数中的临时值调用复制构造函数时
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 为什么需要复制构造函数,在哪些情况下它们非常有用
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 为什么类中的ostringstream类型的成员会导致";调用隐含删除复制构造函数";错误
- 复制构造函数、赋值运算符C++
- std::ofstream 作为类成员删除复制构造函数?
- 复制构造函数C++无法正确复制指针
- 关于复制构造函数的一个棘手问题
- 为什么调用复制构造函数而不是移动构造函数?
- 填充上编译器生成的复制构造函数之间的不一致
- C++ 对象指针数组的复制构造函数
- C++ 基本 CTOR 说明 - 为什么不调用赋值/复制构造函数
- 防止在复制构造函数中隐式调用基构造函数
- 为用户定义的类正确调用复制构造函数/赋值运算符
- 具有已删除移动和复制构造函数的类的就地构造
- 复制构造函数隐式转换问题
- 复制构造函数中的递归调用