Вывод LValue Тип ссылки - PullRequest
0 голосов
/ 22 ноября 2018

Существует довольно много дискуссий и разъяснений по поводу вывода аргументов шаблона и, в частности, свертывания ссылок и "универсальных ссылок".Этот вопрос проходит через соответствующие детали: Как автоматически выводится тип? , и эта статья Скотта Мейерса углубляется в детали и, возможно, дает больше примеров и более широкий контекст: 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 & из-за этих слов в стандарте прямо здесь».

1 Ответ

0 голосов
/ 22 ноября 2018

В C ++ нет выражений ссылочного типа.Тип переменной ir равен int&, а тип выражения ir равен int.Этот последний тип используется для вывода типа, поскольку аргументы функции всегда выражения (за исключением специального случая braced-init-lists ).

См. [expr.type] / 1

Если выражение изначально имеет тип «ссылка на T» ([dcl.ref], [dcl.init.ref]),тип корректируется до T перед дальнейшим анализом.Выражение обозначает объект или функцию, обозначаемую ссылкой, и выражение является lvalue или xvalue, в зависимости от выражения.

...