0

我有一个类,其复制构造函数已被删除。当尝试遍历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;
}

}

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

我非常热衷于学习如何使用现代特性,并试图学习如何正确处理特殊成员函数,作为对现有代码进行现代化改造的一部分(我们仍然有原始指针)。

4

1 回答 1

4

它比你想象的要简单:

for (auto &f : fooVec)

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

for (auto f : fooVec)

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

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

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

for (const auto &f : fooVec)

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

于 2019-08-22T01:37:27.463 回答