std::ref
The primary purpose of std::ref
is to convert an object or a reference into a reference_wrapper, allowing references to be treated like objects.
The std::ref
function template is particularly useful in situations where references need to be passed to functions or stored in containers that expect copy-constructible and assignable types.
It helps in scenarios where functions or templates require objects, but you want to pass or store references instead.
In C++, std::ref
is a utility function provided by the <functional>
header in the C++ Standard Library. It is part of the C++ Standard Template Library (STL) and is used to create a reference_wrapper object.
#include <iostream>
#include <functional>
void modifyValue(int& value) {
value *= 2;
}
int main() {
int originalValue = 42;
// Using std::ref to pass a reference to modifyValue
std::ref(originalValue); // Creates a reference_wrapper<int>
modifyValue(originalValue); // Modifies the originalValue
std::cout << "Original Value: " << originalValue << std::endl;
return 0;
}
Output:
Original Value: 84
std::ref
is commonly used when working with algorithms, function objects, or containers that expect copyable types but need to operate on references. Here’s another example:
#include <iostream>
#include <algorithm>
#include <functional>
#include <vector>
int main() {
std::vector<int> numbers = {1, 2, 3, 4, 5};
// Correct usage with std::for_each and std::ref
std::for_each(numbers.begin(), numbers.end(), [](int& value) {
std::cout << value << " ";
std::ref(value) *= 2; // Correctly capturing by reference
});
std::cout << "\nAfter modification: ";
for (const auto& num : numbers) {
std::cout << num << " ";
}
std::cout << std::endl;
return 0;
}
Output:
1 2 3 4 5
After modification: 2 4 6 8 10
In this example, std::ref
is used to create a reference_wrapper for the lambda function, which is then passed to std::for_each
. This allows the lambda to modify the elements of the numbers
vector in-place.
Keep in mind that std::ref
should be used with caution, especially when the lifetime of the referenced object is shorter than the lifetime of the reference_wrapper, as it doesn’t extend the lifetime of the referred object.