适用于“memcpy()”的相同简单复制限制是否也适用于“std::copy()”?

Gab*_*les 0 c++ memcpy undefined-behavior trivially-copyable

Cppreference 指出,关于std::memcpy()(强调):

如果对象可能重叠或不可平凡复制,则 的行为memcpy 未指定并且可能未定义。

因此,我总是在使用之前检查以确保对象是可简单复制的memcpy(),如下所示:

#include <type_traits>

static_assert(std::is_trivially_copyable<T>::value, "Type T must "
    "be a trivially-copyable type in order to guarantee that `memcpy()` is safe "
    "to use on it.");
memcpy(&outputData, &data, sizeof(data));
Run Code Online (Sandbox Code Playgroud)

std::copy()然而,似乎没有这个限制:https://en.cppreference.com/w/cpp/algorithm/copy。

类型必须可简单复制才能不具有未定义行为的限制是否不适用于std::copy()?

另外,我刚刚在我的“placement new”答案中意识到,这让我想知道整个事情,我只是用了memcpy()代替std::memcpy(),而我没有, using namespace std;那么调用了哪个函数?是memcpy()与 不同的实现吗std::memcpy()?

Nic*_*las 5

memcpy是一个复制字节的函数。std::copy复制对象。在某些情况下,复制对象的字节可以复制该对象。

但这些不是同一件事。std::copy在某些情况下,将内存的字节复制视为一种潜在的优化,以实现其目标:复制对象。这是一个实施细节。对于memcpy,按字节复制就是它的作用;按字节复制有时可以复制对象可能是一个附带好处。

还应该注意的是,它对std::copy通用迭代器进行操作。它可以“复制”到ofstreamvia 适当的ostream_iterator,也可以从ifstreamvia复制istream_iterator。std::copy对来源或目的地并不挑剔。相比之下,memcpy要求您从连续的字节序列复制到连续的字节序列(并且这些序列是不相交的)。