对于一个lambda来说,是否有效,本质上是closures它自己?

这个lambdarecursion是有效的吗?

#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 } 

它似乎编译和运行正常 ,但我很担心在我初始化相同的声明closuresg 。 1-10级的严格有效性?

在通过引用捕获g的点上,它已经被声明,所以名字可以使用:

3.3.2 / 1一个名称的声明点紧跟其完整声明符(第8条)之后,并且在其初始化符之前

你可以在初始化之前以有限的方式使用对象 – 基本上,任何不依赖于值的东西都是OK的:

3.8 / 6在对象的生命周期开始之前,但是在对象将占用的存储之后已经分配了任何引用原始对象的glvalue,可以使用,但只能以有限的方式使用。 使用不依赖于它的值的glvalue属性是明确的。

所以根据我的理解,你在做什么是明确的。

(虽然是超generics的,我不认为它是在为自动对象分配存储空间时指定的,而8.3.2 / 5说“不需要定义”有效“就是初始化引用一个有效对象的引用”所以有可能争辩说它不是很好的定义)。