是否可以调用 std::search_n,计数为 0

Can std::search_n be called with a count of 0?

本文关键字:search 调用 std 是否      更新时间:2023-10-16

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"是空的。