【发布时间】:2013-12-23 05:03:03
【问题描述】:
我正在查看 N3485 25.3.1 [alg.copy] 的 C++ 标准,它定义了 4 种算法:
copycopy_backwardcopy_ifcopy_n
在copy的描述中,有这个注释25.3.1 [alg.copy]/3:
要求:结果不得在 [first,last) 范围内
也就是说,copy 在范围重叠时并不总是正确工作(类似于memcpy)。
copy_backward 和 copy_if 具有相似的语言禁止重叠范围(分别为 25.3.1 [alg.copy]/14 和 25.3.1 [alg.copy]/8)。
但是copy_n没有这样的禁止,copy_n_backward也没有。这是否意味着copy_n 在范围重叠时会做正确的事情?
(MSVC++ 的 copy_n 实现似乎委托给 std::memmove,所以我知道它在 MSVC++ 2013 上是安全的。但如果标准另有暗示,我不想依赖它)
【问题讨论】:
-
"MSVC++ 的
copy_n实现似乎委托给std::memmove" 请注意,我们只在这种转换正确的情况下这样做;也就是说,迭代器是指向可简单复制的对象的指针。 -
@James:当然。 :) 在这种情况下,这是一个安全的转换。
-
@James:啊,我明白你的意思了。如果输入是例如
std::list迭代器,这对 MSVC++ 的实现是不安全的。听起来像是对我的回答...... -
哇,这是一个奇怪的边缘情况,我想说这可能是一个错误(他们打算将其设为 UB),但它似乎几乎是故意遗漏的......
-
原来的SGI implementation确实对
copy_n有这样的要求。我不知道为什么这不在标准中。你可以提交一个问题。顺便说一句,copy仅禁止在输入范围内输出 开始 的重叠,但当输出范围 结束 在输入范围内(即复制到左侧)时工作正常)。
标签: c++ algorithm stl stl-algorithm