Вывод аргумента шаблона для ссылок в качестве аргументов - PullRequest
3 голосов
/ 11 июня 2019

Я пытаюсь глубоко понять шаблонную аргументацию.Одна вещь, которую я не понимаю, это то, как я должен применять правила в стандарте здесь для типов A и P для следующего случая (к сожалению, на cppreference.com нет примера, см.ниже соответствующего раздела)

template<typename T>
void foo(T t);

void call_with_reference(int& r) {
    foo(r)
}

-> Совпадение P и A, что дает: T выводится в int&

, что является ошибочным.Где в стандарте правило, гласящее, что ссылки из A удалены ?Неплохой, однозначный четкий ответ был бы очень признателен.

Соответствующий раздел: enter image description here

1 Ответ

4 голосов
/ 11 июня 2019

A - это тип выражения.Тип выражения описывается как [expr.type] / 1 :

Если выражение изначально имеет тип «ссылка на T» ([dcl.ref], [dcl.init.ref]), тип настроен на T.

Так что здесь A равно int.

Это выражение lvalue, но оно не будет воспроизводитьсялюбая роль, поскольку P не является ссылкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...