C++ std::for_在不可复制对象的向量上

C++ std::for_在不可复制对象的向量上,c++,language-lawyer,C++,Language Lawyer,我正在阅读关于以下内容的std::for_each: 与其他并行算法不同,for_不允许 复制序列中的元素,即使它们很小 可复制的 因此,对我来说,这意味着std::for_each不会复制容器中的构造对象,它应该可以很好地处理不可复制对象的容器。但在尝试使用VS2015编译此代码时: std::vector<std::thread> threads; std::for_each( threads.begin(), threads.end(),

我正在阅读关于以下内容的
std::for_each

与其他并行算法不同,for_不允许 复制序列中的元素,即使它们很小 可复制的

因此,对我来说,这意味着
std::for_each
不会复制容器中的构造对象,它应该可以很好地处理不可复制对象的容器。但在尝试使用VS2015编译此代码时:

   std::vector<std::thread> threads;

   std::for_each(
      threads.begin(), 
      threads.end(), 
      [threads](std::thread & t) {t.join(); });

我对上述引用的理解有什么错误?

您的lambda捕获块尝试按值捕获整个向量。这是不必要的,因为对元素的访问是通过引用参数授予的

试试这个:

std::vector<std::thread> threads;

std::for_each(threads.begin(), threads.end(), [](std::thread & t){t.join();});
std::向量线程;
std::for_each(threads.begin()、threads.end()、[](std::thread&t){t.join();});

lambda捕获块尝试按值捕获整个向量。这是不必要的,因为对元素的访问是通过引用参数授予的

试试这个:

std::vector<std::thread> threads;

std::for_each(threads.begin(), threads.end(), [](std::thread & t){t.join();});
std::向量线程;
std::for_each(threads.begin()、threads.end()、[](std::thread&t){t.join();});

为什么需要捕获
线程
for_each
没有复制任何内容,但lambda的捕获块是。注意:VS2015现在已经相当老了,在最新版本中,在标准一致性(和性能)方面已经取得了长足的进步。。您可能想尝试一下:)为什么需要捕获
线程
for_each
没有复制任何内容,但是您的lambda的捕获块是。注意:VS2015到现在已经相当旧了,在最新版本中已经在标准一致性(和性能)方面取得了巨大进步。。您可能想尝试一下:)