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.
Это 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
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP