当前位置:  开发笔记 > 编程语言 > 正文

为什么std :: copy_n采用模板参数而不是std :: size_t?

如何解决《为什么std::copy_n采用模板参数而不是std::size_t?》经验,为你挑选了1个好方法。

这么简单的问题.

template
OutputIt copy_n(InputIt first, Size count, OutputIt result);

为什么std::copy_n要为要复制的元素数量而不是简单地采用一种类型std::size_t?我只是想不出一个理由.

template
OutputIt copy_n(InputIt first, std::size_t count, OutputIt result);

Cheers and h.. 6

在这种情况下推测原始理论基本上是徒劳的,但是这种设计copy_n可以用例如intptrdiff_t类型的负数来调用,在这种情况下它根本就什么都不做,而且对于标准化委员会的成员来说肯定已经清楚了.是非常称职的人.


另一个优点是,对于特殊的迭代器,例如输入和输出迭代器,大小可能比任何可能的指针差异大,因此可能大于size_t可以表示的大小.例如,对于32位Windows中大于4GB的文件,情况就是如此.定义copy_n用表观指针/迭代器算术表示,"对于每个非负整数i < n,执行*(result + i) = *(first + i)",这看起来似乎将这种优势降级到非常特殊的情况,但符号适用于纯输入和输出迭代器,如

C++11§25.1/ 12:

"在操作员的算法的描述+-用于一些迭代器类别为其中它们没有被定义.在这些情况下,语义与.的语义a+n相同

X tmp = a;
advance(tmp, n);
return tmp;

和那个b-a是一样的return distance(a, b);


设计的通用性没有固有的优势,相反,它本身就是一个缺点,因为它更冗长,并且对不正确的使用代码产生不太容易理解的诊断.它的优点包括上面列出的两个.显然,委员会认为这些优势,或许还有其他(?),超过了Size作为模板参数的固有缺点.



1> Cheers and h..:

在这种情况下推测原始理论基本上是徒劳的,但是这种设计copy_n可以用例如intptrdiff_t类型的负数来调用,在这种情况下它根本就什么都不做,而且对于标准化委员会的成员来说肯定已经清楚了.是非常称职的人.


另一个优点是,对于特殊的迭代器,例如输入和输出迭代器,大小可能比任何可能的指针差异大,因此可能大于size_t可以表示的大小.例如,对于32位Windows中大于4GB的文件,情况就是如此.定义copy_n用表观指针/迭代器算术表示,"对于每个非负整数i < n,执行*(result + i) = *(first + i)",这看起来似乎将这种优势降级到非常特殊的情况,但符号适用于纯输入和输出迭代器,如

C++11§25.1/ 12:

"在操作员的算法的描述+-用于一些迭代器类别为其中它们没有被定义.在这些情况下,语义与.的语义a+n相同

X tmp = a;
advance(tmp, n);
return tmp;

和那个b-a是一样的return distance(a, b);


设计的通用性没有固有的优势,相反,它本身就是一个缺点,因为它更冗长,并且对不正确的使用代码产生不太容易理解的诊断.它的优点包括上面列出的两个.显然,委员会认为这些优势,或许还有其他(?),超过了Size作为模板参数的固有缺点.


@DeiDei:设计就是这样,这表明委员会成员不同意你的观点.是的,这是一个权威论点.我发现这种权威论证是唯一能够有效地反对故意无知现实的论点.
@DeiDei:对于容器大小使用签名类型有合理的(尽管不是恕我直言)令人信服的论点:虽然我不同意他在那个和其他主题上说的很多,但如果你感兴趣,Lakos在他的大型C++书中概述了他们的恶心. ,但最好的是支持天真/直观地使用`abs(c1.size() - c2.size())`.此外,非类型化宏可能会用于提供大小,并且默认为"int",除非太大.有*未定义的行为*如果这些类型随便传递给`copy_n`是一个完全不必要的*非常危险的想法.
推荐阅读
殉情放开那只小兔子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有