这么简单的问题。
template<class InputIt, class Size, class OutputIt>
OutputIt copy_n(InputIt first, Size count, OutputIt result);
为什么
std::copy_n
会采用要复制的元素数量类型而不是std::size_t
呢?我只是想不出原因。template<class InputIt, class OutputIt>
OutputIt copy_n(InputIt first, std::size_t count, OutputIt result);
最佳答案
在这种情况下,推测原始的基本原理是徒劳的,但通过这种设计,可以用负数(例如)来调用 copy_n
。 int
或ptrdiff_t
类型,在这种情况下,它根本不执行任何操作,而且标准化委员会的成员肯定是清楚的,他们是非常称职的人。
另一个优点是,使用特殊的迭代器(例如输入和输出迭代器),其大小可能大于任何可能的指针差,因此可能大于size_t
可以表示的大小。例如。对于32位Windows中大于4GB的文件,情况就是这样。 copy_n
的定义用明显的指针/迭代器算法表示,“对于每个非负整数i < n
,执行*(result + i) = *(first + i)
”,这似乎确实可以将这种优势转移给非常特殊的情况,但是这种表示法可容纳纯输入和输出迭代器如中所述
C++ 11§25.1/12:
设计的通用性没有内在的优势,而是它本身的一个缺点,因为它更加冗长,并且对于不正确的使用代码会生成不太容易理解的诊断信息。它的优点包括上面列出的两个。显然,委员会认为这些优势,也许还有其他优势(?)胜过将Size
作为模板参数的固有弊端。
关于c++ - 为什么std::copy_n使用模板参数而不是std::size_t?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34522254/