【发布时间】:2016-02-09 11:57:55
【问题描述】:
考虑以下示例代码:
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时返回的闭包对象的类型相同? (使用“普通”函数模板,以及在main()的主体中定义add时,也会获得相同的结果。) - 与第二次调用有何不同——正如我对 this answer 所期望的那样——闭包类型不同?
【问题讨论】:
-
好吧,你调用的是
add的operator()的同一个专业化...... -
什么是 t "auto f2 = [t{3}](auto u) { return t + u; };"
-
@Columbo:我期待以下结果:当调用
add的operator()时,在主体中生成并返回具有唯一类型的新的唯一闭包——因为它也发生在主要的。这种期望有什么问题? -
如果在循环中调用 lambda
add并在运行时提供循环边界会发生什么?编译器如何能够为循环的每次迭代生成唯一的 lambda 类型?我在这里注意到add使用的类型在所有情况下都是int根据示例(请参阅初始帖子) -
@Niall:我得到了例子,谢谢。你是对的,这很自然:具有给定参数的成员函数具有唯一的返回类型,而不是每次调用的新类型。