这么简单的问题。

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 intptrdiff_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/

10-11 22:28
查看更多