Lambda比较是确定性的吗?

16

众所周知,比较两个匹配的字符串字面量可以得到相等结果:

"hello" == "hello" //could be true or false

同样适用于lambda函数吗:

[](){} == [](){} //false - guaranteed?

编译器是否有自由评估此项,还是保证它将评估为false?这合法吗?上面的代码到底在比较什么?


闭包类型甚至有operator==吗?我在快速检查中找不到相关参考... - Kerrek SB
LucDanton 告诉我之前它并没有得到保证。 - Pubby
1个回答

24

无法比较lambda的相等性。在那个小片段中,您看到的是将lambda转换为函数指针,然后比较函数指针。不能保证这些函数指针相同或不同,这意味着结果可以是true也可以是false


6
不,比较函数指针不是未定义行为。但结果是未指定的。(也就是说,truefalse都是有效的结果,但让你怀孕不是) - R. Martinho Fernandes
1
@Luchian 嗯,是的,但出于不同的原因:字符串字面量明确允许重叠,然后数组将会衰减为相同的指针。Lambda 表达式不需要重叠即可转换为相同的指针。 - R. Martinho Fernandes
@R. Martinho Fernandes § 20.8.1 4 可调用对象是可调用类型的对象。我可以将lambda理解为一个对象吗? - billz
@billz 匿名函数。 - Luchian Grigore
2
@billz 是的,lambda表达式只是普通的函数对象,除了一些特殊的语法和有时候会有一些额外的东西(比如前面提到的转换为函数指针)。 - R. Martinho Fernandes
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接