forward
Условно приводит свой аргумент к ссылке rvalue, если аргумент представляет собой rvalue или ссылку rvalue. Это восстанавливает присущие rvalue характеристики аргумента для функции пересылки для обеспечения точной пересылки.
template<class Type> // accepts lvalues
Type&& forward(typename remove_reference<Type>::type& Arg)
template<class Type> // accepts everything else
Type&& forward(typename remove_reference<Type>::type&& Arg) noexcept
Параметры
Параметр |
Описание |
---|---|
Type |
Тип значения, передаваемого в Arg, который может отличаться от типа Arg. Как правило, определяется аргументом шаблона функции пересылки. |
Arg |
Аргумент для приведения. |
Возвращаемое значение
Возвращает ссылку rvalue Arg, если значение, переданное в Arg, изначально было rvalue или ссылкой на rvalue; в противном случае возвращает Arg, не изменяя его тип.
Заметки
Необходимо указать явный аргумент шаблона для вызова forward.
forward не пересылает аргумент. Вместо этого путем условного приведения аргумента к ссылке rvalue, как если бы он изначально был rvalue или ссылкой rvalue, forward позволяет компилятору выполнять разрешение перегрузки с использованием сведений об исходном типе пересылаемого аргумента. Видимый тип аргумента для функции пересылки может отличаться от его исходного тип, например, если rvalue используется в качестве аргумента для функции и привязано к имени параметра; наличие имени делает его lvalue независимо от того, существует ли это значение фактически как rvalue, forward восстановит присущие rvalue характеристики аргумента.
Восстановление присущих rvalue характеристик исходного значения аргумента для выполнения разрешения перегрузки известно как точная пересылка. Точная пересылка позволяет шаблонной функции принимать аргумент любого ссылочного типа и восстановить его присущие rvalue характеристики, когда это необходимо для правильного разрешения перегрузки. С помощью точной пересылки можно сохранять семантику перемещения для значений rvalue и избегать необходимости предоставления перегрузок функциям, которые отличаются только ссылочным типом их аргументов.
Требования
Заголовок: <utility>
Пространство имен: std