首页 > 解决方案 > lambda 捕获中的隐式类型

问题描述

我从 C++ 编程开始,很好奇为什么这是合法的:

auto myFun = [n=0]() mutable {return n++;};

我原以为这行不通,因为 C++ 是一种强类型语言,但编译器似乎推断出整数类型?

标签: c++

解决方案


Lambdas 是在 C++11 中引入的。C++11 中没有默认初始值设定项:

auto myFun = [n]() { /* body */ };

这就是你在 C++11 中所拥有的一切。不管是什么类型n,这就是你捕捉到的、类型和价值。

C++14 引入了默认初始化值。我想可以更改语法,以便初始化的捕获变量使用完整的、成熟的声明,例如:

auto myFun = [int n=0]() mutable {return n++;};

这可能是可能的,但这并不是真正必要的。尽管 C++14 的默认捕获值没有显式声明它们的类型,但它们的类型是从它们的初始化表达式中推断出来的,就像它们被显式声明一样。并且由此产生的语法变化很小。和:

auto myFun = [n=0]() mutable {return n++;};

nis的类型int,就像它被显式声明一样“强”。它不是一个char,也不是一个short。它是一个int. 故事结局。

另外,请记住:

template<typename Arg> void function(Arg arg)

当 this 被调用时,类型Arg被推导出来,它也变成了一个真正的强类型。所以这实际上与模板参数没有什么不同:最终实例化时,它们的类型仍然与其他 C++ 中的类型一样强大。


推荐阅读