Стандарт C ++, разрешение / соответствие перегруженной функции - PullRequest
7 голосов
/ 07 августа 2010

Стандарт C ++ гарантирует следующее?

template<typename T>
void function(T (&)[1]);

template<typename T>
void function(T*);

int a[1];
function(a); // first function gets called, not second version

1 Ответ

6 голосов
/ 07 августа 2010

Да, это гарантировано, но причина отличается от того, что говорит 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);

, и второе будет выбрано, если есть хотя бы один аргумент.

...