Подтвердить что ты не робот

Какое стандартное/официальное название для универсальных ссылок?

Я знаю, что если переменная или параметр объявлен как тип T&& для некоторого выводимого типа T, эта переменная или параметр широко называют универсальной ссылкой.

Термин универсальная ссылка был представлен Скоттом Мейерсом в его оригинальной речи "Универсальные ссылки в С++ 11" . Однако интересно, какой официальный/стандартный термин для универсальных ссылок.

4b9b3361

Ответ 1

Обзор

Известно, что с С++ 11 параметр типа T&& называется ссылкой rvalue [ИСО/МЭК 14882: 2011 §8.3.2/p2 Ссылки [dcl.ref]]. То есть, если T - это тип параметра шаблона или auto или typedef для некоторого ссылочного типа lvalue.

примеры:

template<typename T>
void foo(T&& p) { // -> T is a template parameter
  ...
}

auto &&p = expression;

Хотя технически T&& в приведенных выше примерах все еще является ссылкой rvalue, его поведение существенно отличается от обычного.

Естественно, вы спросите "почему этот специальный случай не имеет специального синтаксиса". Ответ заключается в том, что синтаксис && был преднамеренно перегружен для этой специальной конструкции комитетом С++. Однако они пропустили назвать этот особый случай.

В отсутствие отдельного имени для этой конкретной конструкции Scott Meyers придумал широко известный термин/имя универсальные ссылки.

Однако комитет решил, что это имя не подходит по ряду причин. Таким образом, предложение N4164, сделанное Herb Sutter, Bjarne Stroustrup и Габриэль Дос Рейс предложил изменить название на Ссылки на переадресацию.

Название Ссылки на пересылку оказало наибольшую поддержку в неофициальных обсуждениях среди членов комитета, включая авторов упомянутого выше предложения. Интересно, что именно сам Скотт Мейерс ввел этот термин в своем оригинальном разговоре "Универсальные ссылки". Однако позже он решил согласиться с названием универсальных ссылок. Для этого решения сыграла роль тот факт, что в то время он не думал, что термин пересылки ссылок включает также случай auto&&.

Почему не универсальные ссылки?

Согласно предложению, термин Универсальные ссылки, хотя и является разумным именем с очевидным значением, в некоторых аспектах он ошибочен.

Универсальная ссылка должна означать следующее:

  • Ссылка, которая может использоваться повсюду; или
  • Ссылка, которая может использоваться для всего; или
  • нечто подобное.

Очевидно, что это не так и не подходит для этой конструкции. Кроме того, это имя побудило бы многих людей считать, что что-то, имеющее такое имя, предназначено для использования "повсеместно". Что-то, что комитет сочтет это плохим.

Кроме того, "универсальные ссылки" действительно даже как таковой, а скорее набор правил для использования ссылок определенным образом в определенном контексте с некоторой поддержкой языка для этого использования, а , который использует переадресацию.

Почему auto&& также рассматривается случай пересылки

auto&& также рассматривается как форвардный случай, так как он следует за правилами свертывания ссылок. Например, в:

  • Общие лямбда формы, [](auto&& x){ … }
  • for - закодированный цикл формы, for(auto &&i : v) { ... }
  • Наконец, в общем случае верно, что локальные переменные auto&& предназначены для пересылки.

Стандартные словари для ссылок на переадресацию

Термин ссылки пересылки упоминается в

template <class T> int f(T&& heisenreference);
template <class T> int g(const T&&);
int i;
int n1 = f(i); // calls f<int&>(int&)
int n2 = f(0); // calls f<int>(int&&)
int n3 = g(i); // error: would call g<int>(const int&&), which
// would bind an rvalue reference to an lvalue

- конец примера]

§14.8.2.5/p10 Вывод аргументов шаблона из типа [temp.deduct.type]:

Аналогично, если P имеет форму, содержащую (T), то каждый тип параметра Pi соответствующего модельного списка параметров P сравнивается с соответствующий тип параметра Ai соответствующего parameter-type-list of A. Если P и A являются типами функций, которые исходит из вычета при принятии адреса функции шаблон (14.8.2.2) или при выводе аргументов шаблона из (14.8.2.6) и Pi и Ai являются параметрами список параметров уровня верхнего уровня для P и A, соответственно, Pi настраивается если это ссылка для пересылки (14.8.2.1), а Ai - значение lvalue ссылка, и в этом случае тип Pi изменяется как шаблон (т.е. T && изменен просто на T). [Примечание: как результат, когда Pi T&& и Ai X&, скорректированный Pi будет T, заставляя Т выводиться как X&. - end note] [Пример:

template <class T> void f(T&&);
template <> void f(int&) { } // #1
template <> void f(int&&) { } // #2
void g(int i) {
f(i); // calls f<int&>(int&), i.e., #1
f(0); // calls f<int>(int&&), i.e., #2
}

- конец примера] Если объявление параметра, соответствующее Pi, является пакет параметров функции, затем сравнивается тип его декларатора с каждым оставшимся типом параметра в списке параметров типа A. Каждое сравнение выводит аргументы шаблона для последующих позиций в пакеты параметров шаблона, расширенные пакетом параметров функций. При частичном упорядочении (14.8.2.4), если Ai первоначально была функцией пакет параметров: