函数参数中的c++函数定义

c++ function definition in the argument of a function

本文关键字:函数 定义 c++ 参数      更新时间:2023-10-16

我最近发现了一部分代码,如下所示:

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代码。你正在处理一些事情:

  1. Lambda函数
  2. 唯一指针
  3. 关闭

你需要做一些阅读来确切地理解代码的作用。