c – 标准库实现是否合法使用具有子概念的概念模板化的函数?

使用c 11和c 14库概念,c标准库的有效实现可以创建模板上模板化的函数的专用版本,以利用子概念的附加功能进行优化,这是基础无法实现的.单独的概念,例如std :: vector的InputIterator构造函数,以及满足RandomAccessIterator要求的迭代器?
// specified by standard
vector(InputIt begin,InputIt end,const Allocator& alloc = Allocator());
// is this specialization allowed in an implementation if it provides the same functionality?
vector(RandomAccessIt begin,RandomAccessIt end,const Allocator& alloc = Allocator());

这里,InputIt是满足InputIterator概念要求的类型,RandomAccessIt满足RandomAccessIterator的要求.值得注意的是,这个概念缺乏找到两个迭代器之间差异的要求,而它的曾孙概念RandomAccessIterator确实需要

It a,b;
It::difference_type c = a - b;

有效.在RandomAccessIterator也是由提供的迭代器实现的概念的情况下,找到两个迭代器之间的差异将有助于std :: vector的InputIterator构造函数,因为它允许实现预先分配最终所需的空间.矢量,而不是在施工期间多次调整大小.

我可以看到它是有效的,因为标准偶尔使用as-if规则,例如继承层次结构中的虚函数的协变返回类型.但是,情况之间存在相当明显的差异,因此我也可以看到协变返回类型背后的逻辑可能不一定转移到这种情况.

重申一下:c标准库的有效实现是否可以创建一个概念上模板化的函数的专用版本,而单独使用基本概念是不可能的?

注意:我没有用c++-concepts标记这个问题,因为据我所知,该标签适用于Concepts-Lite和Concepts TS,这个问题是关于c 11和c 14中的库概念

解决方法

无法在外部确定使用C中的给定签名调用的构造函数.

因此,矢量签名的确切细节可以在as-if规则下变化,只要可以调用指定的所有构造函数,获得的行为满足记录的特征,并且任何无效的构造函数参数仍然存在无效(因为外部代码可以执行SFINAE测试以确定给定的参数集是否构造std :: vector).

正如OP和评论所指出的,许多标准库实现只是使用标签分派来转发更高效的更专业版本.

有趣的是构造函数上下文之外的答案,您可以在其中检测具有特定签名(而不仅仅是兼容性)的函数,并且可以区分不同的函数.我不知道这里的答案,但我的(未经验证的)印象是,与标准中描述的确切签名不匹配的函数实际上有时会出现在std库中.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...