【问题标题】:Why doesn't the move constructor get called in the fill_n为什么在 fill_n 中不调用移动构造函数
【发布时间】:2011-09-03 14:45:29
【问题描述】:

我得到的错误是下面的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"; } ) );
}

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

【问题讨论】:

    标签: multithreading c++11 stl-algorithm


    【解决方案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"; });
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 2017-07-03
      • 1970-01-01
      • 2014-01-24
      相关资源
      最近更新 更多