Почему объект класса ведет себя таким образом?

В моем коде встретилась следующая структура классов, я ее упростил до примера:

#include <iostream>
#include <vector>

using namespace std;

class B {
public:
    int counter = 0;
    void say()
    {
        this->counter += 1;
        cout << "B Counter: " << this->counter << endl;
    }
};

class A 
{
public:
    static vector<B> list;
    static void add()
    {
        B b;
        list.push_back(b);
    }
    static void foo()
    {
        for(B b : list)
        {
            b.say();
         }
    }
};

vector<B> A::list{};

int main()
{
    A::add();
    A::foo();
    A::foo();
    return 0;
}

Ожидаю, что с каждым вызовом A::foo() будет увеличиваться внутренний счетчик объектов B в его статическом векторе A::list. Однако, счетчик увеличивается лишь 1 раз, далее сохраняется так. Ума не приложу, почему именно один раз а потом все, может тут какая-то тонкость, которой я не понимаю? Вывод данного примера:

Counter B: 1
Counter B: 1

Ответы (1 шт):

Автор решения: Harry

Исправьте объявление счетчика на

inline static int counter = 0;

Иначе он создается при каждом создании объекта B b, вносимого в list. Вы же туда кладете разные объекты b, и у каждого свой счетчик...

Оказывается, неверно понял вопрос... но удалять эту часть не буду, так как она тоже информативна :) Но на уточненный вопрос дополнительно отвечу — вот здесь

for(B b : list)

b получается по значению, т.е. путем копирования объекта их списка, так что увеличение счетчика у вас происходит в копии объекта, а не у объекта в векторе. Чтобы работало, как вы хотите, используйте ссылку:

for(B& b : list)
→ Ссылка