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?据我所知,它既简单又标准布局。
特殊要求是“可简单复制”。
对于任何普通可复制类型
T
,如果两个指针T
指向不同的T
对象obj1
和obj2
,其中既不obj1
是obj2
基类子对象,如果组成的基础字节(1.7)被复制obj1
到obj2
, 43obj2
随后将保持与 相同的值obj1
。43) 例如,通过使用库函数 (17.6.1.2)
std::memcpy
或std::memmove
.
POD 和标量可以满足这一点。但 VC++ 的要求比必要的要窄。libstdc++ 也是如此,它要求类型完全简单。仅 libc++ 测试is_trivially_copy_assignable
.