Почему конструктор перемещения не вызывается в fill_n - PullRequest
2 голосов
/ 03 сентября 2011

Полученная ошибка говорит о том, что строка fill_n ниже пытается использовать конструктор удаленной копии: почему он не пытается использовать конструктор перемещения?Я попытался обернуть его в std::move, но это не помогло.

std::vector< std::thread > workers;
workers.reserve( 10 );
std::fill_n( std::back_inserter( workers ), 10, std::thread( []{ std::cout << "thread\n"; } ) );

Однако, если я изменю строку fill_n на

for( int i = 0; i < 10; ++i )
{
  workers.push_back( std::thread( []{ std::cout << "thread\n"; } ) );
}

, это прекрасно работает.Я думал, что это, по сути, то же самое, что я делал изменения от одного к другому в чем-то похожем коде.

1 Ответ

7 голосов
/ 03 сентября 2011

На линии

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