Прямая передача (англ. Perfect Forwarding) — идиоматический механизм переноса атрибутов параметров в процедурах обобщённого кода языка C++. Он был стандартизирован в редакции стандарта C++11 с помощью функционала библиотеки STL и синтаксиса передаваемыx ссылок (англ. forwarding references), а также унифицирован для применения совместно с вариативными шаблонами[1][2].
Прямая передача используется в тех случаях, когда от функций и процедур обобщённого кода требуется оставлять неизменными фундаментальные свойства своих параметризованных аргументов, то есть[1]:
Это достигается тем, что поведение &&
-аргументов шаблонов отличается от традиционных &&
-ссылок, хотя и подчиняется тем же самым правилам. Несмотря на идентичный синтаксис их семантика для компилятора имеет существенные отличия[3]:
&&
-ссылка для конкретного типа интерпретируется как rvalue-ссылка, которая может быть связана только с перемещаемыми объектами.&&
-ссылка для параметра шаблона интерпретируется как передаваемая или универсальная ссылка, которая может быть связана с изменяемым, константным или перемещаемым объектом.Механизм вывода аргументов шаблонa подчиняется стандартному правилу свёртки (коллапсирования) ссылок (англ. reference collapsing). При переходе к передаваемым ссылкам выясняется не только тип переданного в функцию параметра, но также даётся оценка, является ли он rvalue или lvalue. Если переданный в функцию параметр является lvalue, то подставляемое значение тоже будет ссылкой на lvalue. При этом, отмечается, что объявление типа параметра шаблона в виде &&
-ссылки может иметь интересные побочные эффекты. Например, проявляется необходимость явного указания инициализаторов для всех локальных переменных данного типа, так как при их использовании с lvalue-параметрами вывод типа после инстанцирования шаблона присвоит им значение lvalue-ссылки, которая по требованию языка обязана иметь инициализатор[4].
Практическое воплощение прямой передачи в стандарте языка реализовано с помощью функции std::forward
из заголовочного файла <utility>
[5][6]. Вследствие чего, комбинация специальных правил вывода для &&
-ссылок и их свёртки позволяет создать функциональный шаблоn, который принимает произвольные аргументы с фиксацией их типов и основных свойств (rvalue или lvalue). Сохранение этой информации предопределяет возможность передавать данные аргументы при вызове других функций и методов[7].
Данная страница на сайте WikiSort.ru содержит текст со страницы сайта "Википедия".
Если Вы хотите её отредактировать, то можете сделать это на странице редактирования в Википедии.
Если сделанные Вами правки не будут кем-нибудь удалены, то через несколько дней они появятся на сайте WikiSort.ru .