コンテナーから要素を消去する一般的な方法は、erase-remove-idiom を使用することだと学んだことがあります。しかし、少なくとも g++ の STL 実装が std::list の std::remove() をオーバーロードしていないことを知って驚きました。この場合、ポインター操作による並べ替えを行うことで多くのオブジェクト割り当てを保存できるからです。
C++ 標準がそのような最適化を義務付けていない理由はありますか? しかし、私の主な質問は、std::remove() をオーバーロードする方法です (g++ を超えて移植可能である必要はありません)。そのため、代わりに list::splice()/list::merge() を使用する実装を提供できます。いくつかの署名を試しましたが、せいぜいあいまいなエラーが発生します。たとえば、次のようになります。
template <typename T>
typename std::list<T>::iterator
remove(typename std::list<T>::iterator first,
typename std::list<T>::iterator last, const T &v);
PS: 説明が不十分で申し訳ありません。関数が std 名前空間に由来することと、それらが具体的に何をするかは無視してください。C++ のテンプレート/型特性/オーバーロード ルールについて詳しく知りたいだけです。