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

时间:2011-12-21 19:14:27

标签: c++ lambda c++11

这个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
}

appears to compile and run ok,但我很担心在我初始化它的同一句话中关闭g。严格有效,范围为1-10 ......?

1 个答案:

答案 0 :(得分:22)

在您通过引用捕获g时,它已被声明,因此该名称可供使用:

  

3.3.2 / 1名称的声明点紧接在其完整的声明者(第8条)之后和初始化者之前

您可以在初始化之前以有限的方式使用对象 - 基本上,任何不依赖于值的对象都可以:

  

3.8 / 6在对象的生命周期开始之前但在对象占用的存储之后   已经分配了任何引用原始对象的glvalue,但只能在有限的范围内使用   方法。 [...]使用不依赖于其值的glvalue的属性是明确定义的。

因此,根据我的理解,你所做的事情是明确定义的。

(尽管是超级的,我认为在分配自动对象的存储时没有指定,并且8.3.2 / 5表示“应该初始化引用以引用有效对象”而不定义“有效的“,所以有可能认为它没有明确定义。”