可以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似乎暗示它会.但是,我发现的大多数示例实现都不会.什么说标准?
规范std::search_n是(§25.2.13[alg.search]/p4-7):
Run Code Online (Sandbox Code Playgroud)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,没有非负整数n小于count,这样的条件"为每*非负整数n不到count......"始终是真实的**,所以它应该返回范围内第一个迭代器-这是first.请注意,规范意味着count如果last-count定义不明确,则不允许传递负数,但规范中没有任何内容可以防止count值为零.
我测试的所有标准库实现(libstdc ++,libc ++,MSVC)都会打印该消息.
*这曾经是"为任何......".LWG第2150期改变了这里的措辞,以澄清其意图.
**声明"对S中每个X,P"是空洞地真,如果S是空集.