stl复制功能的实现?

hus*_*ang 5 c++ std c++11 visual-studio-2015

以下是 std::copy 函数的一些实现细节(来自 vs2015):

template<class _InIt,
    class _OutIt> inline
    _OutIt _Copy_impl(_InIt _First, _InIt _Last,
        _OutIt _Dest, _Scalar_ptr_iterator_tag)
    {   // copy [_First, _Last) to [_Dest, ...), pointers to scalars
    ptrdiff_t _Count = _Last - _First;
    _CSTD memmove(&*_Dest, &*_First,
        _Count * sizeof (*_First));
    return (_Dest + _Count);
    }
Run Code Online (Sandbox Code Playgroud)

看起来我们可以在标量类型的情况下使用memmove。但是如果它是POD类型(C++11),为什么我们不能使用memmove?据我所知,它既简单又标准布局。

Col*_*mbo 2

特殊要求是“可简单复制”。

对于任何普通可复制类型T,如果两个指针T指向不同的T对象obj1obj2,其中既不obj1obj2基类子对象,如果组成的基础字节(1.7)被复制obj1obj2, 43obj2随后将保持与 相同的值obj1

43) 例如,通过使用库函数 (17.6.1.2) std::memcpystd::memmove.

POD 和标量可以满足这一点。但 VC++ 的要求比必要的要窄。libstdc++ 也是如此,它要求类型完全简单。仅 libc++ 测试is_trivially_copy_assignable.