Parameter Pack + Rvalue Reference: что это такое, как работает и где об этом почитать?
Пример:
template<typename... Type>
void function(Type&&... args)
{
/* code */
}
Я знаю, что такое parameter pack и rvalue reference, и как они работают. Но я также знаю, что это не просто parameter pack + rvalue reference, и что rvalue здесь имеет совсем другой контекст. Но на cppreference.com или где-то ещё я не нашёл подробного объяснения того, почему и как это работает, и как это вообще называется. Буду признателен за информацию об этом незадокументированном "чуде", которое не так уж редко используется.
PS: Нашёл кое-что интересное, прямо из 14го стандарта:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4164.pdf
Consider this code:
void foo( X&& x );
template<class Y>
void bar( Y&& y );
These parameters are fundamentally different.
Ответы (1 шт):
Это forwarding reference. О них можно почитать тут https://en.cppreference.com/w/cpp/language/reference и тут https://en.cppreference.com/w/cpp/language/template_argument_deduction#Deduction_from_a_function_call, т.е. вполне себе задокументировано. Parameter pack тут ни при чём, т.е. если вы напишите
template<typename T>
void function(T&& args)
{
/* code */
}
то это тоже forwarding reference.
Используется, в основном, для идеальной передачи аргументов в функцию в связке с std::forward, которая тоже задокументирована https://en.cppreference.com/w/cpp/utility/forward. То есть если вы передаёте литерал 42, то будет int&&, а если ссылку на целое, то будет int&. Иначе пришлось бы писать 2 перегрузки для обоих случаев.