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到现在已经相当旧了,在最新版本中已经在标准一致性(和性能)方面取得了巨大进步。。您可能想尝试一下:)