我有一个类,其复制构造函数已被删除。当尝试迭代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)
是否有一种巧妙的方法可以迭代不可复制对象的向量,而无需使用迭代变量?
我非常热衷于学习如何使用现代功能,并尝试学习如何正确处理特殊成员函数,作为现代化某些现有代码的一部分(我们仍然有原始指针)。
这比你想象的要简单:
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不可修改的。