Почему не двигаться конструктор вызывается в заполнении Н


Ошибка, которую я получаю, говорит, что строка 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 2

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"; });
});