可以使用0来调用std :: search_n吗?

Jos*_*een 7 c++ stl-algorithm

可以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!");
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望这段代码能够达到这个std::puts陈述,而大多数的描述std::search_n似乎暗示它会.但是,我发现的大多数示例实现都不会.什么说标准?

T.C*_*.C. 5

规范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);
Run Code Online (Sandbox Code Playgroud)

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,没有非负整数n小于count,这样的条件"为每*非负整数n不到count......"始终是真实的**,所以它应该返回范围内第一个迭代器-这是first.请注意,规范意味着count如果last-count定义不明确,则不允许传递负数,但规范中没有任何内容可以防止count值为零.

我测试的所有标准库实现(libstdc ++,libc ++,MSVC)都会打印该消息.


*这曾经是"为任何......".LWG第2150期改变了这里的措辞,以澄清其意图.

**声明"对S中每个X,P"是空洞地真,如果S是空集.