C++ 将空范围(相同的迭代器)传递给STL算法是否会导致定义的行为?

C++ 将空范围(相同的迭代器)传递给STL算法是否会导致定义的行为?,c++,stl,iterator,C++,Stl,Iterator,考虑以下几点: std::vector<int> vec(1); // vector has one element std::fill(vec.begin(), vec.begin(), 42); std::fill(vec.begin()+1, vec.end(), 43); std::fill(vec.end(), vec.end(), 44); 标准向量向量向量(1);//向量只有一个元素 std::fill(vec.begin(),vec.begin(),42); std

考虑以下几点:

std::vector<int> vec(1); // vector has one element
std::fill(vec.begin(), vec.begin(), 42);
std::fill(vec.begin()+1, vec.end(), 43);
std::fill(vec.end(), vec.end(), 44);
标准向量向量向量(1);//向量只有一个元素 std::fill(vec.begin(),vec.begin(),42); std::fill(向量begin()+1,向量end(),43); std::fill(vec.end(),vec.end(),44);
上述所有
std::fill
用法是否会导致定义的行为?我是否保证vec不会被修改?我倾向于认为“是”,但我想确保标准允许这样的使用。

虽然我不认为标准中明确禁止这样做,但我会说不。标准要求迭代器范围的类型为
[first,last)
包括
first
和所有直到但不包括
last
的内容。为
first
last
传递相同的值在这个定义中没有逻辑意义,因为它既包括也不包括,所以我希望返回未定义的行为

编辑:
清理了我的初始响应,并添加了以下内容:在仔细检查我的后,我发现
[x,x)
形式的间隔被定义为空集。因此,我上面的回答是错误的——我不会期望得到未定义的行为。

否,如果不会导致未定义的行为

该标准在24.1/7中定义了空迭代器范围,并指出为
std::fill
算法提供空范围会导致未定义的行为


这实际上是一个经过深思熟虑的实现所期望的。对于自然处理emtpy范围的算法,将检查空范围的要求强加给调用者将是一个严重的设计错误。

这是什么?“我会说是”还是“我希望得到未定义的行为”?我想我不太清楚我回答的是哪一个问题--“是”回答的是标题问题和你在正文中提出的第一个问题:“上面所有的std::fill用法都会导致定义的行为吗?”。噢,哇。我多次误读了这个问题,即使是在复制+粘贴时。答案应该是“否”。抱歉。FacePalm仍然无法真正解析此响应。范围[x,x]被定义为空范围(24.1/7)。它也可以自然地转换为循环
(auto-iter=x;iter!=x;++iter)
[first,last]并不是真正的“包含第一个和所有内容,但不包括最后一个”。它的读法更像“首先@AndreyT在他的第二个例子中不是有一个未定义的行为吗?我可以看到当范围为空时,
begin()==end()
,但是
begin()+1
不是
end()
,对吗?@Arak:在我的第二个例子中,
begin()+1==end()
,因为
vec.size()==1
(注意构造函数的使用以大小为准).@Emile抱歉,lool是我错过了,抱歉AndreyT:)@AraK:没有。请注意,向量从一开始就以大小1创建。因此,
begin()+1
end()
。此标准库缺陷报告似乎相关:标准库活动问题列表中的此项似乎也相关:实际上,这些问题的根本原因似乎是如何在没有输入的情况下生成返回值。
std::fill()
没有遇到此问题,它只是无能为力。