标准库实现专门化一个基于子概念的概念模板的函数合法吗
Is it legal for a standard library implementation to specialize a function templated on a concept with a child concept?
使用c++11和c++14库概念,c++标准库的有效实现是否可以创建一个以概念为模板的函数的专用版本,以利用子概念的附加功能进行优化,而这些优化仅使用基本概念是不可能的,例如使用std::vector
的InputIterator
构造函数,以及满足CCD_ 3要求的迭代器?
// 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
构造函数,因为这将允许实现预先分配最终向量所需的空间,而不是在构建过程中多次调整其大小。
我认为它是有效的,因为Standard偶尔会使用类似规则,比如在继承层次结构中使用虚拟函数的协变返回类型。然而,这些情况之间存在明显的差异,因此我也可以看到协变返回类型背后的逻辑可能不一定转移到这种情况。
重申一下:c++标准库的有效实现是否可以创建一个以概念为模板的函数的专用版本,以利用子概念的附加功能进行优化,而仅凭基本概念是不可能的?
注意:我没有用c++概念标记这个问题,因为据我所知,这个标记是针对concepts Lite和concepts TS的,这个问题是关于c++11和c++14中的库概念的
没有办法从外部确定用C++中的给定签名调用了哪个构造函数。
因此,vector
签名的确切细节可以在假设规则下变化,只要指定的所有构造函数都可以调用,你得到的行为满足文档中的特性,并且任何无效的构造函数参数都保持无效(因为外部代码可以进行SFINAE测试,以确定给定的参数集是否会构造std::vector
)。
正如OP和注释所指出的,许多标准库实现只是使用标记调度来转发到更高效、更专业的版本。
感兴趣的是构造函数上下文外部的答案,在这里您可以检测具有特定签名(而不仅仅是兼容性)的函数,并且可以区分不同的函数。我不知道这里的答案,但我有一种(未经验证的)印象,即与标准中描述的确切签名不匹配的函数有时确实会出现在std
库中。
- 尝试根据类中 typedef 的存在来专门化模板函数
- 如何基于模板化类的基类专门化成员函数
- 专门化模板覆盖函数/避免对象切片
- 如何使用模板化类专门化模板化函数?
- 线程 std::调用未知类型,无法专门化函数错误
- 如何在编译时专门化大型模板函数中的小部分
- 模板函数,其中一个参数需要专门化,而另一个不需要
- 错误 C2893 无法专门化函数模板'unknown-type std::invoke(_Callable &&,_Types &&...)'
- 从 std 命名空间中专门化函数模板的想法有多糟糕?
- 为模板函数专门化一个模板类
- 基于参数值的c++模板成员函数专门化
- 如何确定函数专门化的主模板
- 等价参数的c++函数专门化
- 基于运行时值调用不同的模板函数专门化
- 跨库的模板函数专门化符号匹配
- 模板函数专门化,c++
- 如何使用type_traits或模板函数专门化来整合模板方法
- 如何在子类中重载模板化函数(专门化)
- 可变模板函数:专门化头/尾和空基准情况
- 不允许void的部分函数专门化-替代解决方案