C ++ имеет долгую историю ошибок, связанных с неявными преобразованиями.Взгляните на книгу Стивена Дьюхерста "C ++ Gotchas";Самая длинная глава посвящена обращениям.Эта тема буквально полна ловушек, и мы должны быть рады, что вышеприведенное должно быть напечатано явно.При этом ...
Есть ли какие-то угловые случаи, которые мне не хватает?
Рассмотрим такой набор перегрузки:
void f(void *n);
void f(int& n);
иизображения, которые указатели неявно конвертировать в ссылки.Следующий вызов
int n = 42;
f(&n);
будет неоднозначным, поскольку оба преобразования будут считаться эквивалентным соответствием.Это сбивает с толку ненужное.
Другим примером могут быть ссылки на указатели.Не обязательно то, что вы будете делать часто, но это действительно так:
int n = 42;
int* ptr = &n;
int*& refToPtr = ptr;
С неявным указателем на преобразование ссылок вышеприведенное будет компилироваться и для
int& refToPtr = &n;
, даже если вы имели в видучто-то другое, и опять же, быть менее допустимым здесь - хорошая вещь, чтобы предотвратить такие ошибки.