Advanced c++ : Must know concepts

Amit.Kumar
2 min readJun 11, 2023
  1. Perfect forwarding and its use in generic code

Perfect forwarding is a C++ technique that allows passing arguments to another function while preserving their value category (lvalue or rvalue) and constness. It is particularly useful in generic code where the type and value category of the arguments may vary.

Perfect forwarding is achieved through the use of rvalue references (T&&) and std::forward. Here's how it works:

#include <iostream>
#include <utility>

void bar(int& arg) {
std::cout << "Lvalue reference: " << arg << std::endl;
}

void bar(int&& arg) {
std::cout << "Rvalue reference: " << arg << std::endl;
}

template <typename T>
void foo(T&& arg) {
bar(std::forward<T>(arg));
}

int main() {
int x = 42;
foo(x); // Pass lvalue
foo(123); // Pass rvalue
foo(std::move(x)); // Pass rvalue reference
return 0;
}

In this example, the foo function accepts a forwarding reference T&& arg and forwards it to the bar function using std::forward. The correct overloaded version of bar is invoked based on the value category of the argument. The output demonstrates that perfect forwarding preserves the original value category of the arguments.

By utilizing perfect forwarding, generic code can be written more efficiently and avoid unnecessary copies or moves, improving both performance and code flexibility.

The forwarding reference parameter T&& can bind to both lvalues and rvalues. If an lvalue is passed, T will be deduced as an lvalue reference, and if an rvalue is passed, T will be deduced as an rvalue reference.

Inside the function, std::forward is used to forward the argument to another function, preserving its value category:

std::forward is a conditional cast that returns an rvalue reference (T&&) if the argument is an rvalue, and an lvalue reference (T&) if the argument is an lvalue. It ensures that the argument is passed with the correct value category

2.

--

--

Amit.Kumar

I have been a coder all my life . And yes a dreamer too. But i am also interested in understanding different aspects of life .