Да, это гарантировано, но причина отличается от того, что говорит GMan.Перегрузка «массив длины 1» будет выбрана, поскольку она более специализирована, чем вторая в частичном порядке функций шаблона.По сути, это означает, что аргумент в форме T(&)[1]
всегда будет соответствовать второму аргументу шаблона в форме T*
, поэтому первая перегрузка будет всегда выбираться, когда последовательности преобразования не решаются.
От13.3.3:
С учетом этих определений жизнеспособная функция F1 определяется как лучшая функция, чем другая жизнеспособная функция F2, если для всех аргументов i ICSi (F1) не хуже последовательности преобразования, чемICSi (F2), а затем
для некоторого аргумента j, ICSj (F1) является лучшей последовательностью преобразования, чем ICSj (F2), или, если не так,
F1 - это не шаблонная функция, а F2 - специализация шаблонной функции, или, если не так,
F1 и F2 - функции шаблона, а функцияшаблон для F1 более специализирован, чем шаблон для F2 в соответствии с правилами частичного упорядочения, описанными в 14.5.5.2, или, если не так,
...
На нормальные функции влияет толькопервый элемент;когда какие-либо шаблонные функции находятся в наборе функций-кандидатов, второй или третий элемент может решить.Причина, по которой мы так хотим, заключается в том, что мы хотим писать, казалось бы, неоднозначные шаблонные перегрузки.Например,
template <class T> void f(T);
template <class T> void f(T*);
в противном случае было бы неоднозначным для int*
.В C ++ 0x вы даже можете написать объявления вроде:
template <class ...Ts> void f(const Ts&... args);
template <class T, class ... Ts> void f(const T& a, const Ts&... args);
, и второе будет выбрано, если есть хотя бы один аргумент.