"Closures" in the abstract sense are just functions which have
previously declared variables accessible to them lexically which are
not passed to the functions as arguments. These so-called "free"
variables are said to be closed over by the function.
Unlike some languages, C++ does not have closures built in, and they
have to be synthesized. They are synthesized as objects with a
operator() method (function objects) which keep the "closed over"
variables as data members. You have probably written hundreds of them
without labelling them as closures in your mind - they are pretty
basic. Most function objects of class type are closures.
As suggested, because such "closures" (ie function objects) comprise a
"package" containing the data members plus a function to operate on
them, they can be useful for passing to other functions for those other
functions to do something with them: you could think of such function
objects as self-contained callbacks. This can be done opaquely,
because any function object can be stored polymorphically in a
std::function object. They are also commonly passed statically as
types of a template function - this occurs throughout the standard
library.
C++11 lambdas are just a syntactic convenience to construct anonymous
function objects "on the fly". The closed-over free variables to be
incorporated in the function object are specified in the lambda's
capture list. std::bind also constructs anonymous function objects.
So far as reading is concerned, although VS orientated this is quite a
good introduction:
https://docs.microsoft.com/en-us/cpp/cpp/lambda-expressions-in-cpp
Chris