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
在内部进行,它按预期编译和工作。
甚至更多:如果我在 main之外struct pred
定义,两个测试都按预期工作。
这对我来说没有任何意义。
我认为它可能是具有依赖名称和 ADL 之类的东西,但是......参数remove_if
是一个实例,而不是一个类型。确实,这是一个模板函数,并且参数的类型仍然被解析,但是..
有人可以解释发生了什么以及为什么会发生吗?