【发布时间】:2019-03-29 07:52:57
【问题描述】:
C++ 标准有如下声明:
非泛型 lambda 表达式的闭包类型,没有 满足约束(如果有)的 lambda-capture 具有 将函数转换为指向具有 C++ 语言链接的函数的指针 (10.5) 具有与闭包相同的参数和返回类型 类型的函数调用运算符。
为了更好地理解该语句,我使用cppinsights 来查看clang 编译器对以下函数的说明。
#include <iostream>
using test = void (*)(int);
int main()
{
test t = [](int arg) { std::cout << arg << std::endl; };
}
cppinsights 将函数翻译为:
#include <iostream>
using test = void (*)(int);
int main()
{
class __lambda_7_11
{
public: inline void operator()(int arg) const
{
std::cout.operator<<(arg).operator<<(std::endl);
}
public: using retType_7_11 = void (*)(int);
inline operator retType_7_11 () const
{
return __invoke;
}
private: static inline void __invoke(int arg)
{
std::cout.operator<<(arg).operator<<(std::endl);
}
} __lambda_7_11{};
using FuncPtr_7 = test;
FuncPtr_7 t = static_cast<void (*)(int)>(__lambda_7_11.operator __lambda_7_11::retType_7_11());
}
像往常一样,编译器生成一个匿名类,其中 operator() 重载,以及标准规定的“将函数转换为指向函数的指针”。
我不明白为什么会生成“静态__invoke”函数,而“转换函数”在内部调用“__invoke”(直接作为函数指针)而没有“__invoke”预期的任何参数?
【问题讨论】:
-
提示:查看操作符的返回类型。该函数未被调用。
-
@Rakete1111 你的意思是“__invoke”吗?它是一个函数指针。
-
它是一个函数,返回类型是一个函数指针。 __invoke 不在任何地方调用。