以下是否根据 C++ 标准定义良好?
char* p = 0;
std::equal(p, p, p);
问题真的是这样的:
标准是否要求std::equal(begin1, end1, begin2)
以这样的方式实现 if begin1 == end1
, thenbegin1
和begin2
可以是任何指针,甚至是不指向有效内存对象的指针?
我认为这是标准的意图,但我无法找到明确的声明。
我担心这一点的原因是,VisualStudio 显然试图检查begin2
even when的“有效性” 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);
}