这个lambda递归有效吗?
#include <functional>
#include <iostream>
int main() {
std::function<int(int)> g = [&g](int k) {
return (k ? k * g(k-1) : 1);
};
std::cout << g(10); // 3628800
}
Run Code Online (Sandbox Code Playgroud)
它似乎编译并运行正常,但我很担心g
在我初始化它的同一声明中结束.严格有效的1-10级......?
Mik*_*our 22
在您g
通过引用捕获的位置,它已被声明,因此名称可供使用:
3.3.2/1名称的声明点紧接在其完整的声明者(第8条)之后和初始化者之前
您可以在初始化之前以有限的方式使用对象 - 基本上,任何不依赖于值的对象都可以:
3.8/6在对象的生命周期开始之前但在对象将占用的存储之后已被分配[...]任何引用原始对象的glvalue都可以使用但仅限于有限的方式.[...]使用不依赖于其值的glvalue的属性是明确定义的.
所以根据我的理解,你所做的事情是明确定义的.
(尽管是超级的,我认为在分配自动对象的存储时没有指定,并且8.3.2/5表示"引用应该被初始化以引用有效对象"而不定义"有效",所以有可能争论它没有明确定义).