【发布时间】:2016-05-08 02:30:24
【问题描述】:
对不起,这是一个冗长的问题,但让我分解一下:
C++ 标准是否保证:
void (*Ptr)(void) = [] {};
return Ptr;
仍将被定义行为?
我知道,对于闭包,它将被定义,因为该闭包对象是按值移动/复制的;但是,虽然我知道“常规”函数具有无限/无生命周期,但 Ptr 的目标是否相同?还是每次实例化 lambda 时都会销毁并重新创建它?
我关心的原因是,如果不是,我不能使用 lambdas 作为回调。我想知道。
【问题讨论】:
-
有趣的问题。由于指针将指向某个 static "invoker" 成员,因此静态成员别无选择,只能使用一些虚拟对象来调用 lambda 的
operator()(因为后者是非静态的) .该虚拟对象应该是“调用者”的本地对象,或者是静态的,即它应该在上述上下文中正常工作。但我没有立即在语言规范中看到这种保证。语言规范甚至没有假设该虚拟对象的存在。 -
@ant 为什么?它只需要运行相同的代码。为什么需要在
operator()中?operator()可以通过调用operator void(*)()()返回的静态函数来实现 -
我希望所有“啰嗦”的问题都这么短
-
我假设你的意思是问:如果调用代码然后通过返回的指针进行函数调用,它会被定义为行为吗?
-
@M.M 所有示例都是非规范性的,无论是否在注释中。
标签: c++ lambda language-lawyer