std::ranges::remove 使用 libstdc++ 时 clang trunk 仍然不支持/损坏?

std::ranges::remove still not suported / broken on clang trunk when using libstdc++?

在 gcc trunk 上工作正常,但在 clang trunk 上不行,两者都使用 libstd++。

还是我漏掉了一些非常明显的东西?

Godbolt

#include <algorithm>
#include <iostream>
#include <ostream>
#include <vector>


std::ostream& operator<<(std::ostream& os, const std::vector<int>& v) {
    for (auto&& e: v) os << e << " "; 
    return os;
}

int main() {
    auto ints = std::vector<int>{1,2,3,4,5};
    std::cout << ints << "\n";
    auto [first, last] = std::ranges::remove(ints, 3);
    ints.erase(first, last);
    std::cout << ints << "\n";
}

gcc 很干净。 clang 给出了一堵错误墙,抱怨缺少“__begin”。

更新:如果我使用 -stdlib=libc++ 然后 clang 说“从未听说过”,所以我猜他们还没有。

new Godbolt

这似乎是一个 Clang 错误,在使用 libstdc++ 时会影响范围,请参阅 this issue,其根本原因仍未解决,其他问题作为重复项链接到它,并举例说明它如何影响 libstdc++ 的范围。大约两周前似乎有一些工作。

在 libc++ 中,std::ranges::remove 似乎尚未实现,正如您所注意到的,并且如其 status page 中所述,用于范围实现。