std::search_n
可以count
为0的情况下被称为"安全"吗? 具体来说,如下所示的代码是否有效?
#include <algorithm>
#include <cstdio>
int main(int argc, char *argv[]) {
const int test[7] = {1, 2, 3, 4, 5, 6, 7};
const int *const location = std::search_n(test, test + 7, 0, 8);
if (location == test) {
std::puts("Found it at the beginning!");
}
}
我希望这段代码能够到达std::puts
语句,并且大多数对std::search_n
的描述似乎都暗示它会。 但是,我发现的大多数示例实现都不会。 标准是什么?
std::search_n
的规范是 (§25.2.13 [alg.search]/p4-7(:
template<class ForwardIterator, class Size, class T, class BinaryPredicate> ForwardIterator search_n(ForwardIterator first, ForwardIterator last, Size count, const T& value, BinaryPredicate pred);
4 要求:
Size
型应可转换为整体式 (4.7, 12.3(。5 效果:查找序列中值相等的子序列。
6 返回:第一个迭代器
i
范围内的[first,last-count)
使得对于每个非负整数n
小于count
以下相应条件成立:*(i + n) == value, pred(*(i + n),value) != false
.如果未找到此类迭代器,则返回last
。7 复杂性:最多
last - first
相应的谓词。
当count <= 0
时,没有小于count
的非负整数n
,所以条件"对于每个*非负整数n
小于count
..."始终为 true**,因此它应该返回范围内的第一个迭代器 - 即 first
。请注意,规范意味着如果last-count
定义不明确,则不允许传递负count
,但规范中没有任何内容阻止count
的值为零。
我测试的所有标准库实现(libstdc++,libc ++,MSVC(都会打印消息。
*这曾经是"任何..."。LWG第2150期更改了此处的措辞,以澄清预期含义。
**如果 S 是空集,则语句"对于 S 中的每一个 x,p"是空的。