c++ - lambda 捕获中的隐式类型
问题描述
我从 C++ 编程开始,很好奇为什么这是合法的:
auto myFun = [n=0]() mutable {return n++;};
我原以为这行不通,因为 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++;};
n
is的类型int
,就像它被显式声明一样“强”。它不是一个char
,也不是一个short
。它是一个int
. 故事结局。
另外,请记住:
template<typename Arg> void function(Arg arg)
当 this 被调用时,类型Arg
被推导出来,它也变成了一个真正的强类型。所以这实际上与模板参数没有什么不同:最终实例化时,它们的类型仍然与其他 C++ 中的类型一样强大。
推荐阅读
- node.js - MongoDB:如何从聚合阶段过滤特定值?
- haskell - 括号中的类型声明如何在 Haskell 中工作,如 (Integer -> Integer) -> Integer
- node.js - @nestjs/swagger:如何添加 API URL?
- django - Uncaught (in promise) SyntaxError: Unexpected token < in JSON at position 0. Django 电子商务网站 ajax
- postgresql - DISTINCT ON 是否只允许您进一步限制查询结果?
- php - 使用 PHP 在 MongoDb 中按 15 分钟的时间间隔对结果进行分组
- pyspark - 在 pyspark 模式中指定字符串数组
- function - decimalToBinary 函数的输入是什么
- android - addToBackStack 没有导航回正确的片段
- android - Android LEANBACK 库定制