传递给 std::for_each 的函数是否允许制作序列元素的副本?
Is function passed to std::for_each allowed to make copies of sequence elements?
我最近偶然发现了cpp首选项的措辞:
与其他算法不同,for_each不允许复制序列中的元素,即使它们是微不足道的可复制的。
这种说法是否正确?我没有在标准中找到任何依据。我明白吗,顺便说一句。暗示来自同一页面的以下示例无效?
struct Sum
{
Sum(): sum{0} { }
void operator()(int n) { sum += n; }
int sum;
};
int main()
{
std::vector<int> nums{3, 4, 2, 8, 15, 267};
// ...
// calls Sum::operator() for each number
Sum s = std::for_each(nums.begin(), nums.end(), Sum());
// ...
}
关于 cppreference.com 的这句话来自 C++17 中添加的关于对并行算法的新支持的措辞。
[algorithms.parallel.exec]/3 说:
除非另有说明,否则实现可以从
is_trivially_copy_constructible_v<T>
和is_trivially_destructible_v<T>
为真的序列中任意复制元素(类型为T
)。
请注意,这是在讨论并行算法的上下文中,并行算法定义为具有名为ExecutionPolicy
的模板参数的标准库函数模板。
但是[alg.foreach]/9说for_each(ExecutionPolicy&&, ForwardIterator, ForwardIterator, Function)
:
实现没有根据 [algorithms.parallel.exec] 授予的自由,无法从输入序列中制作元素的任意副本。
据推测,一些并行化技术可以通过复制元素来更有效地处理普通类型。 (也许是为了让它们在记忆中连续?我只是猜测。
所以这些都不适用于较旧的非并行for_each(InputIterator first, InputIterator last, Function f)
。 对于该算法,情况很简单,由于效果被指定为"f
应用于取消引用范围内每个迭代器的结果[first, last)
...",因此函子参数必须是例如*first
而不是*first
的副本.
措辞确实令人困惑,因为还提到
函数的签名应等效于以下内容:
void fun(const Type &a);
签名不需要包含 const &.
我认为您需要看到这样一个事实,即不允许for_each
复制元素作为标准提供给用户的保证,而不是对应用于每个元素的用户谓词函数的限制。
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 使用strcpy将char数组的元素复制到另一个数组
- 使用不带参数的函数访问结构元素
- 给定n个元素的m个集合.在C++中找到出现在最大集合数中的元素
- C++如何通过用户输入删除列表元素
- 如何在类中制作 2D 数组元素,然后在其构造函数中指定其维度?
- 如何用其中一个元素为联合来制作或制造_tuple
- 我如何在C 中制作算法,以在不重复的情况下查找集合的变化(即n元素,选择k)
- 传递给 std::for_each 的函数是否允许制作序列元素的副本?
- 我的代码正在制作 2D 数组元素的重复副本.代码中有什么问题?
- 如何制作一个集合,其中元素使用局部变量进行排序
- 我需要制作一个包含基类和派生类的对象的向量,并知道哪个元素是哪个元素
- C++:用满足特定要求的二维数组的元素制作数组
- C++将双精度中的每个小数点制作成数组元素
- C++:如何制作一个已经包含元素的向量
- 如何制作一个函数,只需更改链接即可交换单链表中的两个相邻元素
- 制作 boost:::fusion::result_of::as_set<> 的实例不调用其元素的构造函数
- 如何在Qt Creator 5.7中制作一个只有一个窗口的c++ GUI程序,但每次点击都会使窗口有其他元素-如设置向导
- 制作副本和从副本弹出后矢量的最后一个元素发生变化