In practice, there is no difference in performance for small types.
With clang -O3 I get identical code in both cases. Without optimization, clang generates different code, and the copying version is less than one instruction.
$ clang ref.cpp -O3 -std=c++11 -S -o ref.s $ clang cpy.cpp -O3 -std=c++11 -S -o cpy.s $ diff ref.s cpy.s
There is a slight difference related to the constant.
Copy capture gives you a const unsigned value. This will not compile:
unsigned cst = 123; [=](const int& i){ return i == ++cst; }
A link-capture of a non-constant variable results in a non-constant unsigned& . This changes the original value as a side effect:
unsigned cst = 123; [&](const int& i){ return i == ++cst; }
Generally, copying large objects should be avoided. If small objects should be constant in the lambda area, but not constant in the current area, copy-capture is a good choice. If the lambda has a longer lifespan than the local object, then copy-copy is the only option.
source share