那么,不允许在函数内定义谓词并使用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
的参数是实例,而不是类型。这是真的,这是一个模板函数,参数的类型仍然被解析,但是..
有人可以解释为什么以及为什么会这样?
答案 0 :(得分:4)
你的第一个问题的答案是肯定的,在C ++ 11之前,某些类型(例如本地类型)不允许作为模板参数。见14.3.1 / 2:
本地类型,没有链接的类型,未命名的类型或类型 任何这些类型的复合不得用作 模板类型参数的模板参数。
由于remove_if
是模板,因此不能使用本地谓词作为参数。