The bland answer is certainly "because it is defined that way", but I guess you look after the why behind that.
Note that you are not looking at really similar things. The first declares the object a and initialize that. The name takes effect right on. This is how it is from beginning of C and likely its parent languages.
The lambda is a different beast. It toes not create the object. Instead it is just a recipe to create one. Somewhat similar to 'struct' that does not create an instance. I teach to think of lambda as syntax sugar to make a struct with members for the captures and an operator () with the body part. With implicit capture it just picks names from use. With C++11 explicit captures you could not really change the name, only prevent accidental pickups. So if you had [x], it mapped to
struct _c_ { auto x; _c_() : x(outer_x); }; with compiler filling in the blanks.
For C++14 Richard observed that it is quite easy to extend to cover many new use cases: why not allow to supply the name and the init expression. So if you look where the elements go, it should be natural to see that in [x=x] the first delegates the name for internal use and the right is the init expression belonging to the environment.
Note anther interesting case with constructors:
struct S {
S(int x) : x(x) // x in scope is the param, but the init list looks only members
{
x *= 2; // doubles the param
assert( this->x * 2 == x ); // the member is hidden but can be accessed explicitly
}
};
Also note that declaration of x in the struct can appear past its use. it is nothing similar to the declaration of objects.