출처: https://www.bfilipek.com/2020/05/lambdasadvantages.html

1. 가독성을 좋게한다.

C++03의 코드

#include <algorithm>
#include <functional>
#include <vector>

int main() {
   using std::placeholders::_1;

   
const std::vector<int> v { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
   
const auto val = std::count_if(v.begin(), v.end(),
                              std::bind(std::logical_and<
bool>(),
                              std::bind(std::greater<
int>(),_1, 2),
                              std::bind(std::less_equal<
int>(),_1,6)));

   
return val;                                        
}

Modern C++

#include <algorithm>
#include <vector>

int main() {
   std::vector<
int> v { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
   
const auto val = std::count_if(v.begin(), v.end(),
                       [](
int v) { return v > 2 && v <= 6;});

   
return val;                                        
}

2. 람다는 코드 국소성을 향상 시킨다

3. 람다는 간단하게 상태를 보존할 수 있다

#include <algorithm>
#include <iostream>
#include <vector>

int main() {
   std::vector<
int> vec { 0, 5, 2, 9, 7, 6, 1, 3, 4, 8 };

   
size_t compCounter = 0;
   std::sort(vec.begin(), vec.end(), [&compCounter](
int a, int b) {
       
++compCounter;
       
return a < b;
   });

   std::cout <<
"number of comparisons: " << compCounter << '\n';

   
for (auto& v : vec)
       std::cout << v <<
", ";
}

4. 람다는 동일 장소에 복수의 오버로드를 허용한다

std::variant와 std::visit를 사용한다

#include <iostream>
#include <
string>
#include <variant>

template<class... Ts>
struct overload : Ts... { using Ts::operator()...; };
template<class... Ts> overload(Ts...) -> overload<Ts...>;

int main() {
   std::variant<
int, float, std::string> intFloatString { "Hello" };
   std::visit(overload  {
       [](
const int& i) { std::cout << "int: " << i; },
       [](
const float& f) { std::cout << "float: " << f; },
       [](
const std::string& s) { std::cout << "string: " << s; }
     },
     intFloatString
   );        
}

위의 코드는 아래 코드와 같다

struct PrintVisitor
{
   void operator()(
int& i) const {
       std::cout <<
"int: " << i; }

   void operator()(float& f)
const {
       std::cout <<
"float: " << f;
   }

   void operator()(
const std::string& s) const {
       std::cout <<
"string: " << s;
   }
};

추가로 variant에 저장된 모든 타입에서 동작하는 컴팩트한 범용 람다를 쓸 수도 있다.

std::variant와 std::visit를 토대로 실행 시에 다양성을 지원한다.

#include <variant>

struct Circle { void Draw() const { } };
struct Square { void Draw() const { } };
struct Triangle { void Draw() const { } };

int main() {
   std::variant<Circle, Square, Triangle> shape;
   shape = Triangle{};
   auto callDraw = [](auto& sh) { sh.Draw(); };
   std::visit(callDraw, shape);
}

5. 람다는 C++ 새로운 규격이 나올 때 마다 더 좋아지고 있다