Шаблон Вывод аргументов пытается определить аргументы шаблона
(типы для параметров шаблона типа Ti, шаблоны для параметров шаблона
TTi и значения для параметров шаблона, не относящихся к типу
Ii), которые можно заменить в каждый параметр P, чтобы получить
выведенный тип A
и на этой странице мы имеем
Если P является ссылкой rvalue на неквалифицированный параметр шаблона cv (так называемые ссылки пересылки), а соответствующий аргумент вызова функции является lvalue, вместо A используется ссылка типа lvalue на A. для вычета (Примечание: это является основанием для действия std::forward Примечание: при выводе аргументов шаблона класса параметр шаблона класса никогда не является ссылкой пересылки (начиная с C++17)):
Код: Выделить всё
template
int f(T&&); // P is an rvalue reference to cv-unqualified T (forwarding reference)
template
int g(const T&&); // P is an rvalue reference to cv-qualified T (not special)
int main()
{
int i;
int n1 = f(i); // argument is lvalue: calls f(int&) (special case)
int n2 = f(0); // argument is not lvalue: calls f(int&&)
// int n3 = g(i); // error: deduces to g(const int&&), which
// cannot bind an rvalue reference to an lvalue
}
Подробнее здесь: https://stackoverflow.com/questions/793 ... ument-in-c
Мобильная версия