2

では、関数内で述語を定義して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なくインスタンスです。確かに、これはテンプレート関数であり、引数の型はまだ解決されていますが..

誰かが何が、なぜ起こるのか説明できますか?

4

1 に答える 1