> непоняно, как компилятор разбирается, какую я функцию явно > специализировал (это и мне самому тут непонятно) — а он спокойно > компилит.
добавим тест
int main()
{
int i = 0;
char c = 0;
fun(i); // fun(T)
fun(&i); // fun(int*)
fun(c); // fun(T)
fun(&c); // fun(T*)fun( (int*)&c ); // нагло врём о типе параметра - получаем вызов fun(int*)
}
На самом деле это перегрузка функций (специализация применяется только для шаблонных классов). Компилятор выбирает нужную функцию, ориентируясь на тип параметра. Это хорошо видно на последнем примере
> непоняно, как компилятор разбирается, какую я функцию > явно специализировал (это и мне самому тут непонятно) - > а он спокойно компилит.
Компилятор определяет, какой из шаблонов специализирован, по тем же правилам, что и при вызове функции без явного указания аргументов шаблона. В данном случае для разрешения перегрузки компилятор должен использовать так называемое частичное упорядочение шаблонов функций (14.5.5.2):
2 Given two overloaded function templates, whether one is more specialized than another can be determined by transforming each template in turn and using argument deduction (14.8.2) to compare it to the other. 3 The transformation used is:
— For each type template parameter, synthesize a unique type and substitute that for each occurrence of that parameter in the function parameter list, or for a template conversion function, in the return type.
— For each nontype template parameter, synthesize a unique value of the appropriate type and substitute that for each occurrence of that parameter in the function parameter list, or for a template conversion function, in the return type.
— For each template template parameter, synthesize a unique class template and substitute that for each occurrence of that parameter in the function parameter list, or for a template conversion function, in the return type. 4 Using the transformed function parameter list, perform argument deduction against the other function template. The transformed template is at least as specialized as the other if, and only if, the deduction succeeds and the deduced parameter types are an exact match (so the deduction does not rely on implicit conversions). 5 A template is more specialized than another if, and only if, it is at least as specialized as the other template and that template is not at least as specialized as the first.
Здраствуйте, Lorenzo_LAMAS. Вы писали:
PM>> На самом деле это перегрузка функций (специализация применяется только PM>> для шаблонных классов).
LL> На самом деле это явная специализация функций.
Оба прогнали — ПК, как всегда, прав
Здраствуйте, Lorenzo_LAMAS. Вы писали:
PM>> Оба прогнали — ПК, как всегда, прав
LL> Нет, я не прогнал, это специализация функции, просто я не знал — какой. LL> Павел объяснил
Начал разбираться в терминах, полез в 14.5.5.1 и ещё больше запутался. Какая же разница между
function template overloading и function template specializations?
L_L>Преспокойно, негодник, вызывает специализацию — хотя должен быть анрезолвед.
Тут не должно быть unresolved. Как и положено вызывается обычная функция (не специализация).
Стандарт предписывает компилятору предпочесть вызов обычной функции вызову шаблонной (13.3.3).
A>Тут не должно быть unresolved. Как и положено вызывается обычная функция (не специализация). A>Стандарт предписывает компилятору предпочесть вызов обычной функции вызову шаблонной (13.3.3).
хехе, в том то и суть, что предпочел, а определения то нету! только объявление
Of course, the code must be complete enough to compile and link.
L_L>>Преспокойно, негодник, вызывает специализацию — хотя должен быть анрезолвед.
A>Тут не должно быть unresolved. Как и положено вызывается обычная функция (не специализация). A>Стандарт предписывает компилятору предпочесть вызов обычной функции вызову шаблонной (13.3.3).
Здравствуйте, Lorenzo_LAMAS, Вы писали:
A>>Тут не должно быть unresolved. Как и положено вызывается обычная функция (не специализация). A>>Стандарт предписывает компилятору предпочесть вызов обычной функции вызову шаблонной (13.3.3).
L_L>хехе, в том то и суть, что предпочел, а определения то нету! только объявление
Ага, таки да, не заметил
Однако, 7.1 в данном случае компилирует, но не может слинковать, что, в принципе, ожидаемо.
Да. Частичное упорядочение используется в любом случае, когда возникает
неоднозначность при разрешении перегрузки шаблонов функций. В данном случае
будет вызвана специализация второго шаблона.
Posted via RSDN NNTP Server 1.7 "Bedlam"
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен