Clang 15 和 C++20 `std::views::filter` 错误

flo*_*tan 5 c++ compiler-errors clang c++20

我想知道为什么这个代码不能用 clang 15 编译,即使范围库在编译器支持页面上的 clang 15 中被标记为完全支持?它确实使用 g++12 进行编译,即使支持仅标记为部分,并且它使用 clang trunk 进行编译。

#include <ranges>
#include <vector>

int main() {
    std::vector x{1,2,3,4};
    auto y = x | std::views::filter([](auto i){ return i <2;});
}
Run Code Online (Sandbox Code Playgroud)

代码是否错误?如果是的话,有没有办法解决这个错误,直到 clang 16 发布为止。我猜范围-v3 会起作用,但也许有人知道如何仅使用标准库来修复它。

有趣的是,我在使用-stdlib=libstdc++and时遇到了不同的错误-stdlib=libc++

  • libstdc++:error: invalid operands to binary expression ('std::vector<int>' and '_Partial<std::ranges::views::_Filter, decay_t<(lambda at <source>:7:37)>>' (aka '_Partial<std::ranges::views::_Filter, (lambda at <source>:7:37)>'))
  • libc++:error: no member named 'views' in namespace 'std'

编译器资源管理器。

use*_*522 7

代码没问题。

然而,Clang 的概念实现被破坏了,libstdc++ 的视图不起作用。这已经是一个已知问题一段时间了,但显然几天前已经得到解决。该代码现在可以在带有 libstdc++ 的 Clang trunk 上运行。请参阅类似的问题和相关错误报告12

Libc++ 的视图实现受到-fexperimental-library标志的保护,您的问题中的特定示例也可以使用该标志进行编译。我不确定,但我认为实现仍然不完整,这就是默认情况下未启用它的原因。不过,我的相关信息可能已经过时了,在这种情况下,警卫可能只是在那里等待稳定。

更新:这两个问题都已在当前 LLVM 主干上得到解决。有关 libstdc++ 视图实现的链接错误报告已修复。libc++ 视图实现(至少对于问题中的代码)不再受-fexperimental-library. 因此,我希望 LLVM 16 版本能够很好地使用所示的代码。