Вывод шаблона для шаблона ссылки rvalue и литерального аргумента в C++C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Вывод шаблона для шаблона ссылки rvalue и литерального аргумента в C++

Сообщение Anonymous »

Я читаю о выводе аргументов шаблона. Определение P и A следующее:

Попытка вывода аргументов шаблона определить аргументы шаблона (типы для параметров шаблона типа Ti, шаблоны для параметров шаблона шаблона TTi и значения для параметров шаблона, не относящихся к типу Ii), которые можно подставить в каждый параметр P для получения выведенного типа A

Об этом страница, у нас есть этот пример:

Если P является ссылкой rvalue на неквалифицированный параметр шаблона cv (так называемые ссылки пересылки), и соответствующая функция аргументом вызова является lvalue, ссылка типа lvalue на A используется вместо 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
}
В int n2 = f(0), когда мы подставляем аргумент шаблона в шаблон, мы получаем P=T&& и 0 — это литерал, поэтому A — это rvalue, так как же сделать вывод, что T — это int?

РЕДАКТИРОВАТЬ
Во-первых, нам нужно решить T&&=int для T, 0 равно не lvalue, поэтому нам не нужно заменять int на int&, тогда при выводе мы отбрасываем ссылку в левой части и получаем T=int.< /п>

Подробнее здесь: https://stackoverflow.com/questions/793 ... ument-in-c
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»