この質問は、 Issue with std::reference_wrapper に触発されています。たとえば、operator<
forとしましょうstd::vector
。関数テンプレートとして次のように定義されています
template< class T, class Alloc >
bool operator<( const vector<T,Alloc>& lhs,
const vector<T,Alloc>& rhs );
その結果、関数引数から対応する関数パラメーターの型への暗黙的な変換は拒否されます (基本的にはテンプレートの性質のため)。これにより、 の有用性と利便性が大幅に低下しstd::reference_wrapper
ます。たとえば、std::sort
onは使用できませんstd::vector<std::reference_wrapper<std::vector<int>>>
。
一方、すべての問題は、operator<
が次のような非テンプレート Koenig 演算子として定義されている場合にのみ解決されます。
template <...>
class vector ... {
friend bool operator<(const vector& a, const vector& b) {...}
};
なぜ標準ライブラリがこれではなく前者のアプローチを採用したのだろうか?