我有以下函数可以旋转 char 向量:
void rotate()
{
std::ranges::rotate(_right, _right.begin() + 1);
}
_right 定义为:
std::vector<char> _right;
尝试用 clang 15 编译它,它抱怨(https://godbolt.org/z/7ovTfxe31):
no matching function for call to '__begin'
原因似乎如下:
in instantiation of template type alias 'iterator_t' requested here
requires contiguous_iterator<iterator_t<_Derived>>
但我假设向量是一个连续的容器。代码使用 GCC 编译并运行。
这是我的问题:
clang 15 及更早版本的编译器在编译 libstdc++ 算法时存在问题,原因在于检查约束是否满足的方式。
请参阅 LLVM 问题 44178:[概念] 延迟替换为未实现的类模板成员的要求。这是一个已知的错误,已在 clang 16 中解决。
与 GCC 不同,clang 不会将成员约束的实例化推迟到成员实例化之前。 在 libstdc++ 的
__begin
中,尽管 __member_begin
显然具有 std::subrange
成员,但由 std::rotate
从向量创建的 std::subrange
不满足约束 .begin()
。结果就无法调用std::rotate
了。