Является ли следующее определение корректным в соответствии со стандартом С++?
char* p = 0;
std::equal(p, p, p);
Вопрос в самом деле:
Требуется ли стандарт, чтобы std::equal(begin1, end1, begin2)
реализовывался таким образом, что если begin1 == end1
, то begin1
и begin2
может быть любым указателем, даже тем, который не указывает на действительный объект памяти?
Я предполагаю, что это намерение стандарта, но я не смог найти утверждение, которое делает это ясным.
Причина, по которой я беспокоюсь об этом, заключается в том, что VisualStudio, по-видимому, пытается проверить "достоверность" begin2
даже при begin1 == end1
. И это противоречит моему пониманию требований стандарта.
EDIT: Вот код от 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);
}