函数参数中的c++函数定义
c++ function definition in the argument of a function
我最近发现了一部分代码,如下所示:
static typename handle_set::iterator find(T* p)
{
return std::find_if(handles().begin(), handles().end(), [p](const std::unique_ptr<T,D>& l) { return l.get() == p; });
}
其中
typedef typename std::set<std::unique_ptr<T,D>> handle_set;
static handle_set& handles(void)
{
static handle_set h_;
return h_;
}
我的问题是关于这个部分:
[p](const std::unique_ptr<T,D>& l) { return l.get() == p; }
这是函数CCD_ 2的第三个自变量。第三个参数可以是函数指针。这是在另一个函数的参数中定义函数指针的内联方式吗?我以前从未见过这种用法。我的理解正确吗?
谢谢。
std::find_if
是模板化的,并接受一个通用的函子(也称为"函数对象")作为第三个参数,它是任何可以作为函数调用的函数。这类"事物"包括函数指针、重载函数调用运算符的任何对象和lambda。
在这种特定的情况下,您会看到它与lambda函数一起使用,lambda函数是一个就地定义的匿名函数。
Lambdas不仅仅是"定义函数指针的一种方式";相反,他们使用给定的代码和捕获的上下文创建了一个函数对象"动态"。lambdas和"正则函数"之间的一个关键区别是lambdas可以捕获上下文(示例中的变量p
)。
此外,指向具有相同签名的函数的指针具有相同的类型,而lambda具有未指定的类型。尽管如此,一个不捕获任何内容的lambda会隐式转换为普通函数指针(请参见C++11§5.1.2/6,感谢Cheers和hth-Alf指出了这一点);这使得它们即使与只接受函数指针而不接受泛型函子的函数一起使用也很有用。
你可能还没有见过lambdas,因为它们是C++语言的新成员(它们已经在今年刚刚批准的C++11标准中进行了标准化)。
第三个参数不是函数指针。它是一个函数对象。那个对象可能恰好是一个指针。但可能不会。它可以是具有CCD_ 5的任何值。lambda就是这样一个值。
它是一个C++11 lambda(匿名函数)。
看起来您已经找到了一些C++11代码。你正在处理一些事情:
- Lambda函数
- 唯一指针
- 关闭
你需要做一些阅读来确切地理解代码的作用。
- 不同翻译单元中不可重载的非内联函数定义
- Visual Studio中的函数声明和函数定义问题
- 编写代码时C++出现错误:错误 1 错误 C2601:'circle':本地函数定义是非法的
- 具有enable_if外部类原型的模板类构造函数定义
- 类的前向声明之后的类成员函数定义,在类声明之前
- 为函数定义符号不明确的指针参数
- C++模板专用化 - 无法匹配函数定义
- 错误:在第 6 行'{'标记之前,此处不允许使用函数定义
- 找不到 #define 的函数定义
- 根据类型特征更改函数定义?
- 将抽象基类中的所有纯虚函数定义为 varaidaic 模板
- 命名空间更改函数定义
- "Type&"与C++函数定义中的"Type*"
- C++:为什么允许在另一个函数中声明函数,而不允许在函数定义中声明?
- 如何从 C++ 中的现有模板函数定义新函数
- 私有在函数定义/实现的返回值范围内是什么意思 (c++)?
- 越界成员函数定义是否需要一个完全限定的类名,直到全局范围
- 为什么c++允许成员函数定义中实例的私有成员访问
- Qt基类函数定义
- C++函数定义中参数列表后面额外一对括号的含义