Почему не двигаться конструктор вызывается в заполнении Н
Ошибка, которую я получаю, говорит, что строка fill_n
ниже пытается использовать конструктор удаленной копии: почему он не пытается использовать конструктор перемещения? Я попытался завернуть его в std::move
, но это не помогло.
std::vector< std::thread > workers;
workers.reserve( 10 );
std::fill_n( std::back_inserter( workers ), 10, std::thread( []{ std::cout << "threadn"; } ) );
Однако, если я изменю строку fill_n
на
for( int i = 0; i < 10; ++i )
{
workers.push_back( std::thread( []{ std::cout << "threadn"; } ) );
}
Это прекрасно работает. Я думал, что это, по сути, то же самое, что я делал изменения от одного к другому раньше в несколько похожем коде.
1 ответ:
На линии
std::fill_n( std::back_inserter( workers ), 10, std::thread( []{ std::cout << "thread\n"; } ) );
Создается один временный экземпляр
std::thread
, иfill_n
пытается сделать 10 копий, чтобы заполнитьworkers
. Вы не можете переместить объект, чтобы сделать многокопий - это просто не имеет никакого смысла.То, что вы хотите, вероятно,
std::generate_n
:std::generate_n(std::back_inserter(workers), 10, [] { return std::thread([] { std::cout << "thread\n"; }); });