以下是根据C ++标准定义明确的吗?
char* p = 0;
std::equal(p, p, p);
问题是这样的:
标准是否要求这样做 std::equal(begin1, end1, begin2)
以这样的方式实现if 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);
}