TransWikia.com

Parameter Pack + Rvalue Reference: что это такое, как работает и где об этом почитать?

Stack Overflow на русском Asked on December 18, 2021

Пример:

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.

One Answer

Это forwarding reference. О них можно почитать тут и тут, т.е. вполне себе задокументировано. Parameter pack тут ни при чём, т.е. если вы напишите

template<typename T>
void function(T&& args)
{
    /* code */
}

то это тоже forwarding reference.

Используется, в основном, для идеальной передачи аргументов в функцию в связке с std::forward, которая тоже задокументирована здесь. То есть если вы передаёте литерал 42, то будет int&&, а если ссылку на целое, то будет int&. Иначе пришлось бы писать 2 перегрузки для обоих случаев.

Answered by dIm0n on December 18, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP