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

Lig*_*ica 43 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
}
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表示"引用应该被初始化以引用有效对象"而不定义"有效",所以有可能争论它没有明确定义).

  • 值得指出的是,如果(通常建议用于lambdas)将`fact`的类型声明为`auto`,这将是不合法的:`auto`变量不能在其自己的初始化程序中使用. (3认同)