Существует довольно много дискуссий и разъяснений по поводу вывода аргументов шаблона и, в частности, свертывания ссылок и "универсальных ссылок".Этот вопрос проходит через соответствующие детали: Как автоматически выводится тип? , и эта статья Скотта Мейерса углубляется в детали и, возможно, дает больше примеров и более широкий контекст: https://isocpp.org/blog/2012/11/universal-references-in-c11-scott-meyers, и его cppconслайды: http://www.aristeia.com/TalkNotes/C++TypeDeductionandWhyYouCareCppCon2014.pdf.
Мой вопрос касается следующего кода:
template <typename T> void f(T t) { t = 0; }
int main() {
int i{5};
int &ir{i};
f(ir);
cout << i << endl; // 5
f<decltype(ir)>(ir);
cout << i << endl; // 0
}
Почему функция моего шаблона f
не выводит, что они набирают int &
?Согласно слайдам Скотта Мейерса (слайд 7) тот факт, что ir
является ссылкой lvalue, просто игнорируется .Это прекрасно объясняет такое поведение, но для полного объяснения , что я потратил некоторое время на чтение справочника и стандарта, пытаясь найти, где оно говорит что-то вроде:
Если является ссылочным типом, указанный тип используется путем вычитания.
Это то, что говорит старая автономная версия ссылки (которую я обычно использую), хотя она говорила это подзаголовок Шаблон функции преобразования , и я не нашел эту формулировку в стандарте.Я обнаружил, что закрытие происходит из правил частичного упорядочения перегруженных шаблонов, но я не верю, что это применимо здесь, даже то, что я искал.
Есть ли где-то в стандарте, что это поведение указано, или оно подразумевается под другим поведением, которое я пропустил?Мне бы очень хотелось сказать кому-то, «что не выводит тип
int &
из-за этих слов в стандарте прямо здесь».