请考虑以下事项:
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);
上述所有std::fill
用法是否会导致定义的行为?我保证vec将保持不变吗?我倾向于认为“是”,但我想确保标准允许这样使用。
答案 0 :(得分:9)
不,如果不会导致未定义的行为。
标准定义了24.1 / 7中的空迭代器范围,并且没有提到向std::fill
算法提供空范围会导致未定义的行为。
这实际上是人们对经过深思熟虑的实施所期望的。使用自然处理emtpy范围的算法,强制要求检查调用者的空范围将是一个严重的设计错误。
答案 1 :(得分:1)
虽然我不相信它在标准中被特别禁止,但我会拒绝。该标准要求迭代器范围为[first, last)
类型,其中包括first
以及所有内容,但不包括last
。传递first
和last
的相同值对于这个定义没有逻辑意义,因为它既包括也包括在内,所以我希望得到未定义的行为。
编辑:
清理了我的初始响应,并添加了这个:在我的mathematical interval notation上刷完后,我发现[x,x)
形式的间隔被定义为空集。所以我的上述答案是错误的 - 我不希望得到未定义的行为。