根据C++标准,以下内容是否定义良好?
char* p = 0;
std::equal(p, p, p);
问题实际上是这样的:
标准是否要求std::equal(begin1, end1, begin2)
被实现为如果begin1 == end1
,那么begin1
和begin2
可以是任何指针,甚至是不指向有效内存对象的指针?
我认为这是标准的意图,但我没有找到一个明确说明这一点的声明。
我关心的原因是,VisualStudio似乎在begin1 == end1
时尝试检查begin2
的“有效性”,这与我对标准要求的理解相矛盾。
编辑:这是我认为违反标准的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);
}
begin1
与end1
进行比较,因此算法是良好定义的,因为它只会执行该比较而不尝试解引用任何内容。 - Mike Seymour[null,null)
是一个有效的范围。 - Mike Seymour