Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C++11: pass (lambda or other) function object by reference or value?

This was originally part of this question:

Passing lambda declared using auto-keyword by non-const reference as argument to std::function parameter type

but I decided to make it a separate one.

In what circumstances is it better/more idiomatic to pass a lambda or other function object by reference or value?

like image 308
Jeet Avatar asked Apr 13 '13 05:04

Jeet


People also ask

Does lambda capture reference by value?

The mutable keyword is used so that the body of the lambda expression can modify its copies of the external variables x and y , which the lambda expression captures by value. Because the lambda expression captures the original variables x and y by value, their values remain 1 after the lambda executes.

Are objects passed by reference in C?

There are references in C, it's just not an official language term like it is in C++. "reference" is a widely used programming term that long predates the C++ standardizing of it. Passing a pointer to an object is passing that object by reference.

How do you pass a lambda function in C++?

Permalink. All the alternatives to passing a lambda by value actually capture a lambda's address, be it by const l-value reference, by non-const l-value reference, by universal reference, or by pointer.

Can you pass an object by reference?

A mutable object's value can be changed when it is passed to a method. An immutable object's value cannot be changed, even if it is passed a new value. “Passing by value” refers to passing a copy of the value. “Passing by reference” refers to passing the real reference of the variable in memory.


1 Answers

You use the same rules for "lambda"s that you would for any object that you take as a parameter.

A function should use non-const reference if the intent of the function is to modify the object for the caller. The function should use const& if it is just using the object without changing it. And it should pass by value if it is going to copy/move the object into its internal storage.

like image 196
Nicol Bolas Avatar answered Oct 07 '22 14:10

Nicol Bolas