При создании небольшого примера программы с Microsoft VisualStudio 2008 я заметил странную вещь о выводе типов, передаваемых шаблонам. Рассмотрим этот пример:
template<class T>
void f( T v ) {
x; // trigger a compile error
(void)v;
}
template<class T>
void g( T v ) {
f( v );
}
void h() {
int i;
g<const int &>( i );
}
Компиляция этого примера с использованием cl /c foo.cpp
приводит к ошибке компиляции (как и предполагалось). Что интересно, так это значение параметра шаблона «Т». Вот что печатает VisualStudio 2008:
mini.cpp(3) : error C2065: 'x' : undeclared identifier
mini.cpp(9) : see reference to function template instantiation 'void f<int>(T)' being compiled
with
[
T=int
]
mini.cpp(14) : see reference to function template instantiation 'void g<const int&>(T)' being compiled
with
[
T=const int &
]
Обратите внимание, что в g
тип аргумента const int &
, но в f
это просто int
. Очевидно, что ссылка на константную часть была удалена при определении типа для использования при создании шаблона f
. При настройке примера так, чтобы f
вызывался как
f<T>( v );
тип const int &
в f
и g
. Это почему? Это указанное поведение? Я тайно полагался на тип аргумента функции v
, передаваемого на f
, но, очевидно, это не так.