【问题标题】:Does a lambda function require any header files?lambda 函数是否需要任何头文件?
【发布时间】:2020-12-10 12:19:15
【问题描述】:

我通常在我的 Mac 上编写代码,而且我不擅长包含标题(clang 似乎在这方面有很大的余地)。结果,我经常不知道我使用的提供的函数属于哪个header。

对于 lambda 表达式,它们是否需要包含任何标头?我查看了https://en.cppreference.com/w/cpp/language/lambda,但没有看到任何相关信息。

【问题讨论】:

  • 简答:否。

标签: c++ c++11 lambda


【解决方案1】:

他们没有。 Lambda 是一种语言功能,而不是库功能。您可以将它们绑定到位于<functional> 中的std::function,但您没有必须

您可以轻松验证这一点,以下代码 compiles as expected 尽管不包含任何 任何 标头:

int main() {
  auto f = [](){};
  f();
}

【讨论】:

  • 哦,我明白了,如果你声明它使用:auto f = [](){};,这个语法是否需要包含<functional>
  • @David No. lambda 有一些实现定义的类型。
  • 但如果您改为使用std::function<double(int)> f = [](int a) -> double {...};,则需要包含功能权限?
  • @David 是的,没错。
  • @David 建议避免使用std::function,因为它很重,除非您确实需要它,即您需要类型擦除。
【解决方案2】:

Lambda 是语言的一部分,因此不需要使用标头,就像您不需要包含标头来定义普通函数一样。

【讨论】:

  • 对位:auto x = {0}; 需要 <initializer_list>typeid 需要 <typeinfo>
  • 因为这两个表达式都使用标准库中定义的类型,但是很好。
【解决方案3】:

代码

int main()
{
    auto x = [](int i) {
        return i;
    };

    x(2);
}

会生成类似的东西

int main()
{
    struct X {
        inline int operator()(int i) const { return i; }
    } x;

    x(2);
}

所以它不需要包含任何标题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-22
    • 1970-01-01
    • 1970-01-01
    • 2011-03-19
    相关资源
    最近更新 更多