没有匹配函数调用 std::list::remove_if( function()::p redicate )

no matching function for call to std::list::remove_if( function()::predicate )

本文关键字:if redicate function list 函数调用 std remove      更新时间:2023-10-16

那么,不允许在函数中定义谓词并用作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移动到 main 之外定义,两个测试都按预期工作。


这对我来说没有任何意义。

我认为它可能具有依赖名称和 ADL 之类的东西,但是......remove_if 的参数是一个实例,而不是一个类型。确实,这是一个模板函数,参数的类型仍然解析,但是..

有人可以解释什么以及为什么会发生吗?

第一个问题的答案是,是的,在 C++11 之前,某些类型(例如本地类型)不允许作为模板参数。参见 14.3.1/2:

本地类型、没有链接的类型、未命名类型或类型 从任何这些类型复合不得用作 模板类型参数的模板参数。

由于remove_if是模板,因此不能使用本地谓词作为其参数。