2

我得到的错误说fill_n下面的行正在尝试使用已删除的复制构造函数:为什么不尝试使用移动构造函数?我尝试将其包装在 a 中,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"; } ) );
}

效果很好。我认为这些与我之前在看起来有点相似的代码中从一个到另一个所做的更改基本相同。

4

1 回答 1

7

在线上

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"; });
});
于 2011-09-03T15:35:55.443 回答