gpt4 book ai didi

c++ - 没有用于调用 std::list::remove_if( function()::predicate ) 的匹配函数

转载 作者:搜寻专家 更新时间:2023-10-31 01:06:18 26 4
gpt4 key购买 nike

那么,在函数内部定义谓词并用作 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:

A local type, a type with no linkage, an unnamed type or a type compounded from any of these types shall not be used as a template argument for a template type parameter.

因为 remove_if 是一个模板,你不能使用本地谓词作为它的参数。

关于c++ - 没有用于调用 std::list::remove_if( function()::predicate ) 的匹配函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21096908/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com