Closure examples in Python and C++11

In Python:

#!/usr/bin/env python

def make_adder(x):
    def adder(y):
        return x+y
    return adder

add3 = make_adder(3);
print add3(5) # 8

def make_appender(post_list):
    def appender(pre_list):
        pre_list.extend(post_list)
    return appender

X = [4, 5]
Y = [1, 2]
Z = [1, 2]
appendX = make_appender(X)
appendX(Y) 
print Y # [1, 2, 4, 5]
X.insert(0, 3) # insert 3 to front
appendX(Z) 
print Z # [1, 2, 3, 4, 5]

import copy

def make_appender2(post_list):
    post_list_copy = copy.deepcopy(post_list)
    def appender(pre_list):
        return pre_list.extend(post_list_copy)
    return appender

X = [4, 5]
Y = [1, 2]
Z = [1, 2]
appendX = make_appender2(X)
appendX(Y) 
print Y # [1, 2, 4, 5]
X.insert(0, 3) # insert 3 to front
appendX(Z) 
print Z # [1, 2, 4, 5]

The same in C++11:

#include <cstdlib>
#include <iostream>
#include <functional>
#include <vector>

using namespace std;

template <class T>
function<T (T const &)> make_adder(T const & x)
{
    auto adder = [=] (T const & y)
    {
        return x + y;
    };
    return adder;
}

template <class T>
function<void (vector<T> &)> make_appender(vector<T> const & post_list)
{
    auto appender = [&] (vector<T> & pre_list)
    {
        pre_list.insert(pre_list.end(), post_list.begin(), post_list.end());
    };
    return appender;
}

template <class T>
function<void (vector<T> &)> make_appender2(vector<T> const & post_list)
{
    auto appender = [=] (vector<T> & pre_list)
    {
        pre_list.insert(pre_list.end(), post_list.begin(), post_list.end());
    };
    return appender;
}

// helper for printing vectors
template <class T>
ostream & operator<<(ostream & ostr, vector<T> const & vec)
{
    ostr << "{";
    if (!vec.empty()) {
        auto it = vec.begin();
        ostr << *(it++);
        for (; it!=vec.end(); ++it)
            ostr << "," << *it;
    }
    ostr << "}";
    return ostr;
}

int main()
{
    {
        auto add3 = make_adder(3);
        cerr << add3(5) << endl; // 8
    }
    {
        vector<int> X = {4, 5};
        vector<int> Y = {1, 2};
        vector<int> Z = {1, 2};
        auto appendX = make_appender(X);
        appendX(Y);
        cerr << Y << endl; // {1, 2, 4, 5}
        X.insert(X.begin(), 3); // insert 3 to front
        appendX(Z);
        cerr << Z << endl; // {1, 2, 3, 4, 5}
    }
    {
        vector<int> X = {4, 5};
        vector<int> Y = {1, 2};
        vector<int> Z = {1, 2};
        auto appendX = make_appender2(X);
        appendX(Y);
        cerr << Y << endl; // {1, 2, 4, 5}
        X.insert(X.begin(), 3); // insert 3 to front
        appendX(Z);
        cerr << Z << endl; // {1, 2, 4, 5}
    }
    return EXIT_SUCCESS;
}