是`char*p = 0; std :: equal(p,p,p)`根据C++标准定义良好?

Kri*_*ege 11 c++ stl visual-studio

以下是根据C++标准定义明确的吗?

char* p = 0;
std::equal(p, p, p);
Run Code Online (Sandbox Code Playgroud)

问题是这样的:

是否标准要求,std::equal(begin1, end1, begin2)以这样的方式来实现,如果begin1 == end1,那么begin1begin2可以是任何指针,甚至一个不指向有效的内存对象?

我认为这是标准的意图,但我无法找到一个明确的陈述.

我担心这一点的原因是,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);
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*k B 9

所以我们有25.2.1/1,它说:

返回:如果对于[first1,last1]范围内的每个迭代器i,则返回以下相应条件:*i ==*(first2 +(i - first1)),pred(*i,*(first2 +(i - first1) )))!= false.

否则,返回false.

在你的情况下,在[0,0]范围内没有迭代器,因此范围内的"每个"迭代器都通过了测试,但是不应该进行实际测试(因为在测试的范围内不存在迭代器).

它对我来说看起来像一个VisualStudio错误.