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,那么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);
}
Run Code Online (Sandbox Code Playgroud)
所以我们有25.2.1/1,它说:
返回:如果对于[first1,last1]范围内的每个迭代器i,则返回以下相应条件:*i ==*(first2 +(i - first1)),pred(*i,*(first2 +(i - first1) )))!= false.
否则,返回false.
在你的情况下,在[0,0]范围内没有迭代器,因此范围内的"每个"迭代器都通过了测试,但是不应该进行实际测试(因为在测试的范围内不存在迭代器).
它对我来说看起来像一个VisualStudio错误.
| 归档时间: |
|
| 查看次数: |
538 次 |
| 最近记录: |