为什么这在正常的 for 循环中工作而不是基于范围的 for 循环?

Why is this working in a normal for loop but not a range based for loop?

void set_fee(Patron p, int fee)
{
    for (Patron x : patrons)
    {
        if (p.get_name() == x.get_name()) x.set_fee(fee);
    }
    
    for (int i = 0; i < patrons.size(); i++)
    {
        if (patrons[i].get_name() == p.get_name()) patrons[i].set_fee(fee);
    }
}

所以 patron 只是一些 class 我做的和 none 这里的功能真的很重要 get_name() 只是 returns 对象的名称和 set_fee(fee) 只是将对象的 fee 设置为费用。

但是有人知道为什么第一个循环不起作用而第二个循环起作用吗?我基本上只想在 patrons 向量中寻找 p,找到它后我想更改向量中赞助人对象的费用,但第一种方法不起作用,为什么?

基于范围的 for 循环中的 x 是向量中元素的副本。你需要在那里参考

for (Patron& x : patrons)
//   ^^^^^^^^
{
   // ....
}

否则 x.set_fee(fee); 将在 copy 上调用。