```
#include <iostream>
#include <functional>
#include <utility>

using namespace std;

typedef std::function<void(const string&, const string&, const bool, const bool)> 
    Callback_T;

class A {
public:
    void
    process(const string &a, const string &b, const bool c, const bool d, const int e)
    {
        cout << "a: " << a << " b: " << b << " c: " << c << " d: " << d << " e: " << e << endl;
    }

    Callback_T
    constructCallback(const int &e)
    {
        Callback_T callback =
        [&, this, e](auto&&...args) // <--- here, e must be captured by value, why?
        {
            this->process(
            std::forward<decltype(args)>(args)...,
            e);
        };

        return callback;
    }
};

int main()
{
    A a;
    auto cb = a.constructCallback(20);
    cb("A", "B", true, false);
}

```

The above program outputs: "a: A b: B c: 1 d: 0 e: 20"
But if I change that line which capture e to:

> 
> [&, this, &e]
> 
> 
> 

It outputs: "a: A b: B c: 1 d: 0 e: **26340408**", seems indicating e is not defined/initialized.

Why only capture it by value works?