考虑这段代码(在GCC和MSVC上编译):
int main()
{
auto foo = [](auto p){
typedef decltype(p) p_t;
auto bar = [](){
return static_cast<p_t>(10);
};
return bar();
};
std::cout << foo(0ull) << std::endl;
}
foo()
是一个模板化的lambda,因为它有一个auto
参数。但是要让bar()
知道类型p_t
,它必须以某种方式隐式模板化,然后引出我标题中的问题:
模板化的lambdas中的所有lambdas是否也模仿了lambdas?
如果是这样的话,那么看起来模板参数的数量会很快增长,如果我有很多嵌套的lambdas(不一定是坏事,但它让我感到意外)。
答案 0 :(得分:1)
我不确定你是否真的可以说lambda是模板化的。具有自动模板参数的lambda类型根本不是模板,因为它与模板模板参数不匹配:
#include <iostream>
auto foo = [](auto param){};
template <class T>
struct functor_template {
void operator()() const { }
};
template <template <class...> class Foo, class... Ts>
void bar(Foo<Ts...>) {
}
int main() {
//bar(foo); //prog.cc:7:6: note: template argument deduction/substitution failed
bar(functor_template<int>{});
}
原因很简单 - 只有在这样的lambdas中非常接近被称为模板的东西才是他们的operator()
。
但是我想你想问一下,带有auto参数的lambda中的lambda类型是否依赖于传递给该lambda的参数类型。答案是 - 是的。这很容易测试:
#include <iostream>
#include <type_traits>
auto foo = [](auto p){
static_cast<void>(p);
typedef decltype(p) p_t;
auto bar = [](){
return static_cast<p_t>(10);
};
return bar;
};
int main() {
static_cast<void>(foo);
std::cout << std::is_same<decltype(foo(int{})), decltype(foo(float{}))>::value << std::endl;
std::cout << std::is_same<decltype(foo(int{})), decltype(foo(int{}))>::value << std::endl;
}
输出:
0
1