假设相同的lambda表达式有不同的类型是否安全?

时间:2018-05-18 19:04:32

标签: c++ optimization lambda language-lawyer

我正在尝试使用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,即ab当然属于同一类型,c具有不同的类型。

允许编译器让ca的类型相同吗?

我的意思是表达式是相同的,这将是一个明显的优化。

PS:如果捕获阻止了这样的优化,那么lambdas没有捕获呢?

相关:what is the type signature of a c++11/1y lambda function?Can the 'type' of a lambda expression be expressed?

1 个答案:

答案 0 :(得分:17)

  

允许编译器让ca的类型相同吗?

没有。 [&counter](){counter++;}是一个lambda表达式,每[expr.prim.lambda.closure]/1

  

lambda-expression的类型(也是闭包对象的类型)是一个唯一的,未命名的非联合类类型,称为闭包类型,其属性如下所述。

因此,对于每个lambda表达式,即使它与前一个表达式相同,您也将得到一个唯一的类型。