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在内部进行,它按预期编译和工作。

甚至更多:如果我在 main之外struct pred定义,两个测试都按预期工作。


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

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

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

4

1 回答 1

4

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

本地类型、没有链接的类型、未命名类型或由这些类型中的任何一种组合而成的类型不应用作模板类型参数的模板实参。

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

于 2014-01-13T17:20:40.943 回答