Template Parameter for Lambdas
Discover different types of lambdas in C++.
We'll cover the following...
With C++20, lambda expressions support template parameters, and hence concepts can be default-constructed and support copy assignment when they have no state. Additionally, lambda expressions can be used in unevaluated contexts. With C++20, they detect when you implicitly copy the this
pointer. This means a significant cause of
Let’s start with template parameters for lambdas.
The subtle differences between different lambdas
Admittedly, the differences between typed lambdas (C++11), generic lambdas (C++14), and template lambdas (template parameter for lambdas) in C++20 are subtle.
#include <iostream>#include <string>#include <vector>auto sumInt = [](int fir, int sec) { return fir + sec; };auto sumGen = [](auto fir, auto sec) { return fir + sec; };auto sumDec = [](auto fir, decltype(fir) sec) { return fir + sec; };auto sumTem = []<typename T>(T fir, T sec) { return fir + sec; };int main() {std::cout << '\n';std::cout << "sumInt(2000, 11): " << sumInt(2000, 11) << '\n';std::cout << "sumGen(2000, 11): " << sumGen(2000, 11) << '\n';std::cout << "sumDec(2000, 11): " << sumDec(2000, 11) << '\n';std::cout << "sumTem(2000, 11): " << sumTem(2000, 11) << '\n';std::cout << '\n';std::string hello = "Hello ";std::string world = "world";// std::cout << "sumInt(hello, world): " << sumInt(hello, world) << '\n';std::cout << "sumGen(hello, world): " << sumGen(hello, world) << '\n';std::cout << "sumDec(hello, world): " << sumDec(hello, world) << '\n';std::cout << "sumTem(hello, world): " << sumTem(hello, world) << '\n';std::cout << '\n';std::cout << "sumInt(true, 2010): " << sumInt(true, 2010) << '\n';std::cout << "sumGen(true, 2010): " << sumGen(true, 2010) << '\n';std::cout << "sumDec(true, 2010): " << sumDec(true, 2010) << '\n';// std::cout << "sumTem(true, 2010): " << sumTem(true, 2010) << '\n';std::cout << '\n';}
Before discussing the output, I want to compare the four lambdas:
-
sumInt
C++ version Type of lambda