gpt4 book ai didi

c++ - 标准库实现专门化以具有子概念的概念为模板的函数是否合法?

转载 作者:可可西里 更新时间:2023-11-01 18:39:01 26 4
gpt4 key购买 nike

使用 c++11 和 c++14 库概念,c++ 标准库的有效实现可以创建一个以概念为模板的函数的专门版本,以利用子概念的附加功能进行优化单独使用基本概念是不可能的,例如 std::vectorInputIterator 构造函数,以及满足 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::vectorInputIterator 构造函数通过提供的迭代器,因为它允许实现预先分配最终 vector 所需的空间,而不是在构造期间多次调整它的大小。

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


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


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

最佳答案

无法从外部确定您在 C++ 中使用给定签名调用了哪个构造函数。

因此,vector 签名的确切细节可以根据 as-if 规则进行更改,只要所有指定的构造函数都可以被调用,您获得的行为满足记录的功能,并且任何无效的构造函数参数仍然无效(因为外部代码可以进行 SFINAE 测试以确定给定的一组参数是否会构造一个 std::vector)。

正如 OP 和评论所指出的,许多标准库实现仅使用标签分派(dispatch)来转发到更高效、更专业的版本。

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

关于c++ - 标准库实现专门化以具有子概念的概念为模板的函数是否合法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34189023/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com