我正在尝试使用lambdas以及不同的lambda表达式具有不同类型的事实,即使它们是相同的。考虑一下这段代码
#include <iostream>
template <typename T> void once(T t){
static bool first_call = true;
if (first_call) t();
first_call = false;
}
int main() {
int counter = 0;
auto a = [&counter](){counter++;};
once(a);
once(a);
std::cout << counter; // 1
auto b = a; // same type
once(b);
std::cout << counter; // 1
auto c = [&counter](){counter++;}; // different type
once(c);
once(c);
std::cout << counter; // 2
}
这会打印112
,即a
和b
当然属于同一类型,c
具有不同的类型。
允许编译器让c
与a
的类型相同吗?
我的意思是表达式是相同的,这将是一个明显的优化。
PS:如果捕获阻止了这样的优化,那么lambdas没有捕获呢?
相关:what is the type signature of a c++11/1y lambda function?和Can the 'type' of a lambda expression be expressed?
答案 0 :(得分:17)
允许编译器让
c
与a
的类型相同吗?
没有。 [&counter](){counter++;}
是一个lambda表达式,每[expr.prim.lambda.closure]/1:
lambda-expression的类型(也是闭包对象的类型)是一个唯一的,未命名的非联合类类型,称为闭包类型,其属性如下所述。
因此,对于每个lambda表达式,即使它与前一个表达式相同,您也将得到一个唯一的类型。