lambda对于有捕获和无捕获的展开有比较大的区别,无捕获的情况下会多两个函数,可以分别看下面代码的Foo
和Bar
。
cpptemplate <typename T, typename U, typename ...Args>
struct get_type_index {
constexpr static size_t value = 1u + get_type_index<T, Args...>::value;
};
template <typename T, typename ...Args>
struct get_type_index <T, T, Args...> {
constexpr static size_t value = 0u;
};
template <size_t index, typename T, typename ...Args>
struct get_index_type {
using type = typename get_index_type<index - 1, Args...>::type;
};
template <typename T, typename ...Args>
struct get_index_type<0u, T, Args...> {
using type = T;
};
众所周知,Lambda表达式是利用重载operator()
实现的语法糖。
同时,Lambda表达式在不捕获变量时能够直接赋值给函数指针,很多同学可能没思考过原因。
cppint main() {
using void_func_t = void (*)();
void_func_t f {};
f = [](){};
return 0;
}
使用cpp insights看一下。(见此链接)
Website: Effective Modern C++
如果你是一位经验丰富的 C++ 程序员并且多少跟我差不多,那你在初次接触 C++11 的时候就会想,“是的,是的,我知道的。它还是 C++,就是多了点东西。”但随着你了解越多,你会为改变的幅度之巨感到震惊。auto 声明,基于 range 的 for 循环,lambda 表达式,还有右值引用完全改变了 C++ 的面貌,这还不说新的并发特性。然后还有一些惯常的改进。0 和 typedef 出局,nullptr 和别名声明新晋。枚举现在应该是限域的了。相比内置的指针类型,现在要更倾向去使用智能指针。移动对象通常也好过于拷贝它们。