使用c ++ 11和c ++ 14库概念,c ++标准库的有效实现可以创建一个概念上模板化的函数的专用版本,以利用子概念的附加功能进行优化,而不是可能只有基本概念,例如InputIterator
构造函数std::vector
和满足要求的迭代器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;
有效.找到两个迭代器之间的差异将是InputIterator
构造函数的帮助,std::vector
在这种情况下RandomAccessIterator
也是由提供的迭代器实现的概念,因为它允许实现预先分配最终向量所需的空间,而不是调整它的大小施工期间多次.
我可以看到它是有效的,因为标准偶尔使用as-if规则,例如继承层次结构中的虚函数的协变返回类型.但是,情况之间存在相当明显的差异,因此我也可以看到协变返回类型背后的逻辑可能不一定转移到这种情况.
重申一下:c ++标准库的有效实现是否可以创建一个概念上模板化的功能的专用版本,以利用子概念的附加功能进行优化,而单独使用基本概念是不可能的?
注意:我没有使用c ++标记这个问题- 概念,因为据我所知,该标签适用于Concepts-Lite和Concepts TS,这个问题是关于c ++ 11和c ++ 14中的库概念.