В c++17
у нас есть сложенное выражение, которое может значительно упростить код, который в противном случае мог бы быть реализован с использованием рекурсии компилятора и SFINAE или перегрузки.Например, в следующем коде
#include <iostream>
#include <utility>
template<typename ...Args>
void printer(Args&&... args) {
(std::cout << ... << args) << '\n';
}
void printer_cpp11() { }
template <typename First, typename ...Args>
void printer_cpp11(First&& first, Args&&... args)
{
std::cout << first;
printer_cpp11(std::forward<Args>(args)...);
}
int main()
{
printer(3, 4, "hello");
std::cout << std::endl;
printer_cpp11(3, 4, "hello");
return 0;
}
функция c++17
printer
(взято из cpp reference ) выполняет ту же работу, что и ее c++11
версия printer_cpp11
.
Во время компиляции генерируется несколько перегрузок функции printer_cpp11
, в то время как для выражения складывания требуется одна функция printer
.
Есть ли преимущество с точки зрения производительностив использовании выражений складки над c++11
-стилем?Или можно предположить, что компилятор включает все перегрузки printer_cpp11
, создавая код с эквивалентной производительностью?