Как в vector записать экземпляр класс и поток с++

Подскажите пожалуйста, как в vector записать экземпляр класс и поток. Я не могу понять что я делаю не так.

class myCub {};
struct Cub
{
    thread CubStream;//поток
    myCub CubInstance;//экземпляр
};
void cub(Cub& objCub)
{
    myCub c;
    objCub.CubInstance = c;
}

int main()
{
    vector<Cub>cubs;
    Cub objCub;
    for (size_t i = 0; i < 3; i++)
    {
        objCub.CubStream = thread(cub,std::ref(objCub));
        cubs.push_back(objCub);
    }
}

Ошибка C2280 "Сube::Сube(const Сube &)": предпринята попытка ссылки на удаленную функцию list-2 C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.28.29910\include\xmemory 696


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

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

Первое, чтобы запустить поток, нужен первый аргумент как адрес функции : thread(cub,std::ref(objCub)).

Потоки копироваться не могут. Разрешается только перенос. По-этому при добавлении в вектор, нужен std::move.

class myCub {};
# include <thread>
using std::thread;
struct Cub
{
    thread CubStream ;//поток
    myCub CubInstance ;//экземпляр
};
void cub(Cub& objCub)
{
    myCub c;
    objCub.CubInstance = c;
}
# include <vector>
using std::vector;
# include <utility>
int main()
{
    vector<Cub>cubs;
    Cub objCub;
    for (size_t i = 0; i < 3; i++)
    {
        // указываем функцию cub
        objCub.CubStream = thread {cub,std::ref(objCub)};
        // переносим в вектор
        cubs.push_back(std::move(objCub));
    }
}
→ Ссылка