对复制构造函数已被删除的对象向量进行迭代 (C2280)

vkn*_*vkn 0 c++

我有一个类,其复制构造函数已被删除。当尝试迭代std::vector此类的包含对象时,我无法以“好的”方式做到这一点,并且必须使用某种迭代变量。

struct foo {

foo() :
    val(0)
{}

foo(const foo&) = delete;

int val;

};

int main() {

std::vector<foo> fooVec(5);

for (auto f : fooVec) //C2280 - attempting to reference a deleted function!
{
    std::cout << f.val << std::endl;
}

for (int i = 0; i < fooVec.size(); i++) //no problems
{
    std::cout << fooVec[i].val << std::endl;
}

}
Run Code Online (Sandbox Code Playgroud)

是否有一种巧妙的方法可以迭代不可复制对象的向量,而无需使用迭代变量?

我非常热衷于学习如何使用现代功能,并尝试学习如何正确处理特殊成员函数,作为现代化某些现有代码的一部分(我们仍然有原始指针)。

Sam*_*hik 5

这比你想象的要简单:

for (auto &f : fooVec)
Run Code Online (Sandbox Code Playgroud)

作为额外的好处,您可以修改它f,就在它位于向量中的位置,在它当前的位置舒适。当使用基本的按值迭代时:

for (auto f : fooVec)
Run Code Online (Sandbox Code Playgroud)

这会生成向量中每个值的副本(因此出现问题),并且任何更改都不会f影响向量中的原始值。

但是,当您使用引用进行迭代时,不会创建任何副本,并且您可以在迭代时修改每个值。

或者,如果您希望继续让编译器为您捕获错误:

for (const auto &f : fooVec)
Run Code Online (Sandbox Code Playgroud)

这仍然会迭代,但每个引用的f值都是const不可修改的。