调用指向不再存在的 lambda 的指针是否合法?
这是演示代码片段。
#include <iostream>
typedef int (*Func)(int a);
int main()
{
Func fun;
{
auto lambda = [](int a)->int{std::cout << a << std::endl; return a;};
fun =lambda;
}
fun(6); //Is it legal? The variable lambda does not exist anymore.
}
Run Code Online (Sandbox Code Playgroud)
通用条件怎么样,比如说有捕获的 lambda?
小智 1
这段代码是合法的。正如您所看到的,如果您使用网站https://cppinsights.io/ ,上面的代码实际上会翻译成这样:
#include <iostream>
typedef int (*Func)(int a);
int main()
{
using FuncPtr_7 = Func;
FuncPtr_7 fun;
{
class __lambda_10_19
{
public:
inline /*constexpr */ int operator()(int a) const
{
std::cout.operator<<(a).operator<<(std::endl);
return a;
}
using retType_10_19 = auto (*)(int) -> int;
inline constexpr operator retType_10_19 () const noexcept
{
return __invoke;
}
private:
static inline /*constexpr */ int __invoke(int a)
{
return __lambda_10_19{}.operator()(a);
}
};
__lambda_10_19 lambda = __lambda_10_19{};
fun = static_cast<int (*)(int)>(lambda.operator __lambda_10_19::retType_10_19());
};
fun(6);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
sofun指向一个静态函数 ( __invoke),该函数不会超出范围。
| 归档时间: |
|
| 查看次数: |
121 次 |
| 最近记录: |