Синтаксис '...' с расширением пакета параметров с использованием std :: forward - PullRequest
0 голосов
/ 08 апреля 2020

В C ++ кажется, что параметр обычно может быть расширен с помощью ... непосредственно после имени пакета параметров. Например,

template <class... Tys>
void function(Tys... params) {
    function(params...);
}

Однако, при использовании std::forward, ... выглядит как после имени пакета параметров. Например,

template <class... Tys>
void function(Tys... params) {
    function(std::forward<Tys>(params)...); // The '...' is outside the parenthesis of 'params'
}

Мой вопрос: почему есть разница? Почему следующий код неверен?

template<class... Tys>
void function(Tys... params) {
    function(std::forward<Tys>(params...));
}

В какой момент пакет параметров расширен? Вероятно, я не совсем понимаю, как работает std::forward или как он идеально передает аргументы.

Я ценю любые ответы!

1 Ответ

3 голосов
/ 08 апреля 2020

... применяется к левой вещи.

  • function(params...)

    расширяется до

    function(param1, param2, ..., paramN).

  • function(std::forward<Tys>(params)...)

    расширяется до

    function(std::forward<Tys1>(param1), std::forward<Tys2>(param2), ..., std::forward<TysN>(paramN))

  • function(std::forward<Tys>(params...))

    расширяется до

    function(std::forward<Tys>(param1, param2, ..., paramN))

...