では、関数内で述語を定義してstd::list::remove_if
引数として使用することは許可されていませんか?
コンパイルに失敗する次のコードを検討してください。
struct a { };
int main()
{
struct pred { bool operator()( const a& ) { return false; } };
std::list< a > l; // fill l
l.remove_if( pred() );
return 0;
}
error: no matching function for call to
‘std::list<a, std::allocator<a> >::remove_if(main()::pred)’
今、私l.remove_if( pred() );
が
pred()( *l.begin() );
// or
pred p;
p( *l.begin() );
これremove_if
は内部的に実行され、コンパイルされ、期待どおりに動作します。
さらに、メインの外struct pred
で定義されるように移動すると、両方のテストが期待どおりに機能します。
これは私には意味がありません。
従属名とかADLとかそういうのかなと思ったのですが… の引数が型でremove_if
はなくインスタンスです。確かに、これはテンプレート関数であり、引数の型はまだ解決されていますが..
誰かが何が、なぜ起こるのか説明できますか?