【发布时间】:2014-08-04 14:59:51
【问题描述】:
C++11 §5.1.2/6
没有 lambda 捕获的 lambda 表达式的闭包类型具有 [...] 转换函数 [...]。这个转换函数的返回值应该是一个函数的地址,当被调用时,它与调用闭包类型的函数调用运算符具有相同的效果。
注意:这并不是说转换总是会返回相同类型的 same 值。那么,以下程序是否与 UB 和它所暗示的所有意义破坏相冲突?
int main() {
auto f = []{};
return ((+f) == (+f));
}
注意:如果有任何真正的编译器提供除true 之外的任何内容,我会感到非常惊讶,但问题是编译器是否可以合法 做其他事情?
编辑:
C++11 §1.3.24
未定义的行为
本国际标准没有要求的行为 [注意:当本国际标准省略任何明确的行为定义或程序使用错误的构造或错误数据时,可能会出现未定义的行为
【问题讨论】:
-
你确定一元 + 允许用于 lambdas 吗?除此之外,您的程序格式正确,并且由于从
main()返回 1,因此仅具有实现定义的行为。 -
@Deduplicator:允许。 lambda 被隐式转换为指针,并且指针可能对它执行了
+(+是此上下文中的标识函数)。
标签: c++ c++11 lambda language-lawyer undefined-behavior