为什么 std::erase(std::erase_if) 不是 <algorithm> 中适用于任何容器的模板?

NoS*_*tAl 3 c++ stl c++-concepts c++20

std::erase(_if)是对 C++20 的一个很好的补充(终于我可以忘记令人讨厌的擦除删除习惯用法),但有一点很奇怪:从某种意义上说,它不是一种通用算法,它只适用于 std:: 容器,例如它可以不对升压向量进行操作。

    #include<string>

    #include<vector>

    #include<boost/container/vector.hpp>

    int main() {
        std::string str = " Hello World  !";
        std::erase(str, ' '); // :)
        boost::container::vector<int> vi{1,2};
        std::erase(vi, 2); // :(
    }
Run Code Online (Sandbox Code Playgroud)

我最好的猜测是,该算法早在标准中投票概念之前就已经处于实验状态,因此需要进行大量工作来重新设计它,或者担心无法正确指定它的概念(即它会在某些情况下无法正确工作)具有时髦语义的用户定义类型)。

所以:我的问题是为什么这不是具有某些概念(或enable_if)要求/调度(例如地图/集)的通用算法?

cpp*_*ner 5

这在原始提案N4009中得到了回答:

Q10. 您是否应该提供一个指定为每个容器执行正确操作的erase_if(Container&, Predicate) 函数模板,而不是为每个容器重载erase_if() ?

A10。这样的通用函数模板可以被赋予用户定义的容器。没有任何“容器特征”,因此无法确定用户定义的容器是类向量、类列表、类地图还是其他容器。用户定义的容器可以简单地被拒绝,但是通用函数模板不会做任何与此处提议的特定重载集不同的事情。请注意,用户定义容器的作者可以在其命名空间中为其容器重载erase_if()。

TL;DR:因为没有办法编写这样的“概念(或enable_if)需求/调度”。