【发布时间】:2020-12-10 12:19:15
【问题描述】:
我通常在我的 Mac 上编写代码,而且我不擅长包含标题(clang 似乎在这方面有很大的余地)。结果,我经常不知道我使用的提供的函数属于哪个header。
对于 lambda 表达式,它们是否需要包含任何标头?我查看了https://en.cppreference.com/w/cpp/language/lambda,但没有看到任何相关信息。
【问题讨论】:
-
简答:否。
我通常在我的 Mac 上编写代码,而且我不擅长包含标题(clang 似乎在这方面有很大的余地)。结果,我经常不知道我使用的提供的函数属于哪个header。
对于 lambda 表达式,它们是否需要包含任何标头?我查看了https://en.cppreference.com/w/cpp/language/lambda,但没有看到任何相关信息。
【问题讨论】:
他们没有。 Lambda 是一种语言功能,而不是库功能。您可以将它们绑定到位于<functional> 中的std::function,但您没有必须。
您可以轻松验证这一点,以下代码 compiles as expected 尽管不包含任何 任何 标头:
int main() {
auto f = [](){};
f();
}
【讨论】:
auto f = [](){};,这个语法是否需要包含<functional>?
std::function<double(int)> f = [](int a) -> double {...};,则需要包含功能权限?
std::function,因为它很重,除非您确实需要它,即您需要类型擦除。
Lambda 是语言的一部分,因此不需要使用标头,就像您不需要包含标头来定义普通函数一样。
【讨论】:
auto x = {0}; 需要 <initializer_list> 和 typeid 需要 <typeinfo>。
代码
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);
}
所以它不需要包含任何标题
【讨论】: