以下は、C++ 標準に従って適切に定義されていますか?
char* p = 0;
std::equal(p, p, p);
質問は本当にこれです:
標準では、 if 、 then 、およびが有効なメモリ オブジェクトを指していない場合でも、任意のポインターになるようstd::equal(begin1, end1, begin2)
に実装されている必要がありますか?begin1 == end1
begin1
begin2
これが標準の意図だと思いますが、これを明確にするステートメントを見つけることができませんでした。
私がこれについて心配している理由は、VisualStudio がbegin2
いつでも「有効性」をチェックしようとするように見えるからbegin1 == end1
です。そしてそれは、規格の要件に関する私の理解と矛盾しています。
編集:これは、標準に違反していると思われるVS 2012のコードです。
template<class _InIt1, class _InIt2> inline
bool equal(_InIt1 _First1, _InIt1 _Last1, _InIt2 _First2)
{ // compare [_First1, _Last1) to [First2, ...)
_DEBUG_RANGE(_First1, _Last1);
_DEBUG_POINTER(_First2);
return (_Equal1(_Unchecked(_First1), _Unchecked(_Last1), _First2, _Is_checked(_First2)));
}
template<class _Ty> inline
void _Debug_pointer(const _Ty *_First, _Dbfile_t _File, _Dbline_t _Line)
{ // test iterator for non-singularity, const pointers
if (_First == 0)
_DEBUG_ERROR2("invalid null pointer", _File, _Line);
}