c – 模板化lambda中的所有lambda都是模板化的lambdas吗?
发布时间:2020-12-16 07:21:10 所属栏目:百科 来源:网络整理
导读:考虑这段代码(在GCC和MSVC上编译): int main(){ auto foo = [](auto p){ typedef decltype(p) p_t; auto bar = [](){ return static_castp_t(10); }; return bar(); }; std::cout foo(0ull) std::endl;} foo()是一个模板化的lambda,因为它有一个auto参数.但
考虑这段代码(在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中的所有lambda都是模板化的lambdas吗? 如果是这种情况,那么看起来模板参数的数量会很快增长,如果我有很多嵌套的lambda(不一定是坏事,但它让我感到意外). 解决方法
我不确定你是否真的可以说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(). 但我想你想问更多lambda中带有auto参数的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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |