对于标准库实现来说,专门化一个带有子概念的概念上的函数是否合法?

时间:2015-12-09 21:09:15

标签: c++ c++11 language-lawyer c++14

使用c ++ 11和c ++ 14库概念,c ++标准库的有效实现可能会创建一个模板上的模板函数的专用版本,以利用子概念的附加功能进行优化。仅使用基本概念是不可能的,例如使用InputIterator的{​​{1}}构造函数,以及满足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()); 是符合InputIterator概念要求的类型,而InputIt符合RandomAccessIterator的要求。值得注意的是,这个概念缺乏找到两个迭代器之间差异的要求,而它的曾孙概念RandomAccessIt 需要

RandomAccessIterator

有效。在It a,b; It::difference_type c = a - b; 也是由提供的迭代器实现的概念的情况下,找到两个迭代器之间的差异将是InputIterator std::vector构造函数的帮助,因为它允许实现预先分配最终向量所需的空间,而不是在构造期间多次调整大小。

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

重申:c ++标准库的有效实现是否可以创建一个概念上模板化的函数的专用版本,以利用子概念的附加功能进行优化,而单独使用基本概念是不可能的? / p>

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

0 个答案:

没有答案