请看以下示例代码:
考虑以下示例代码:
int main()
{
auto id = []()
{
auto ret = [](auto u) { return u; };
return ret;
};
//same closure type -- prints '1'
auto f1 = id();
auto g1 = id();
std::cout<<std::is_same<decltype(f1), decltype(g1)>::value<<std::endl;
//differenct closure type -- prints '0'
auto f2 = [](auto u) { return u; };
auto g2 = [](auto u) { return u; };
std::cout<<std::is_same<decltype(f2), decltype(g2)>::value<<std::endl;
}
问题:
- 为什么第一次调用
std::is_same
返回的闭包对象类型相同?(使用“普通”函数模板也可以得到相同的结果,而且当add
在main()
函数体内定义时也是如此。) - 与第二次调用有何不同,第二次调用中 -- 如我从这个答案所期望的那样 -- 闭包类型不同?
add
的相同特化版本的operator()
... - Columboadd
的operator()
时,在函数内部会生成一个新的具有唯一类型的闭包,并在此之后返回--就像在主函数中发生的那样。这个期望有什么问题吗? - davidhighadd
,会发生什么?编译器如何为每次循环生成唯一的lambda类型?请注意,所有情况下与add
一起使用的类型都是int
,如示例所示(请参见初始帖子)。 - Niall