C++ stl复制功能的实现?

C++ stl复制功能的实现?,c++,c++11,visual-studio-2015,c++-standard-library,C++,C++11,Visual Studio 2015,C++ Standard Library,下面是std::copy函数的一些实现细节(来自vs2015): 模板内联 _输出复制执行(\u InIt\u First,\u InIt\u Last, _OutIt _Dest,_标量_ptr _迭代器_标记) {//copy[_First,_Last)to[_Dest,…),指向标量的指针 ptrdiff\u t\u Count=\u Last-\u First; _CSTD memmove(&*_Dest,&*_First, _Count*sizeof(*u First)); 返回(_D

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

模板内联
_输出复制执行(\u InIt\u First,\u InIt\u Last,
_OutIt _Dest,_标量_ptr _迭代器_标记)
{//copy[_First,_Last)to[_Dest,…),指向标量的指针
ptrdiff\u t\u Count=\u Last-\u First;
_CSTD memmove(&*_Dest,&*_First,
_Count*sizeof(*u First));
返回(_Dest+_Count);
}
似乎我们可以在标量类型的情况下使用memmove。但是如果它是POD类型(C++11),为什么我们不能使用memmove呢?据我所知,它既简单又复杂
标准布局。

特殊要求是“可复制的”

对于任何普通可复制类型
T
,如果指向
T
的两个指针指向 不同的
T
对象
obj1
obj2
,其中既不是
obj1
也不是
obj2
是基类子对象,如果底层字节(1.7) 向上
obj1
复制到
obj2
,43
obj2
随后应保持不变 与
obj1
相同的值

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


除其他外,POD和标量满足了这一要求。但VC++的要求比必要的范围更窄。libstdc++也是如此,它要求类型是完全平凡的。仅对
进行libc++测试就可以轻松地复制指定的

“但如果它是POD类型,为什么我们不能使用memmove呢?”您已经展示了
std::copy
的一个实现,但没有显示标记分派。为POD选择的是什么版本,以及标记分派是如何实现的?libc++使用
是可分配的
(以及附加的次要类型检查)将
std::copy
发送到
memmove
@dyp libstdc++基本上使用
\uuuuuuuuuuu是微不足道的(\uValueTypei)
。有点让人困惑,因为有一些可复制的可分配类不是普通类。@dyp我已经看过MSVC2013,它实际上只使用scalar_标记来执行
memmove
。此外,此标记仅为
is_scalar::value
设置。
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);
    }