我得到的错误是,下面的fill_n行尝试使用已删除的副本构造函数:为什么不尝试使用move构造函数?我尝试将其包装在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"; } ) );
}

效果很好。我认为这些本质上是相同的,因为我之前在外观上有些相似的代码之间进行了更改。

最佳答案

在线上

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

关于multithreading - 为什么未在fill_n中调用move构造函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7293806/

10-12 00:31
查看更多