Вы можете думать о auto
как о заполнителе.В вашем примере объявленные типы a
и b
совпадают.Единственное отличие состоит в том, что auto
выводится как сам указатель в первом случае, тогда как во втором случае он выводится просто Foo<T>
.
За исключением одного особого случая, auto работает так же, каквывод аргумента шаблона с помощью функции:
template<class U>
void func_a(U);
template<class U>
void func_b(U*);
template<class T> struct Foo {};
template<class T>
void test() {
func_a( new Foo<T> ); // U = Foo<T>*
func_b( new Foo<T> ); // U = Foo<T>
}
В вашем примере auto
выводится так же, как параметр типа U
в приведенном выше коде.
Особый случай, о котором я говорилявляются списками инициализаторов:
void test2() {
auto x = {1,2,3}; // OK, decltype(x) --> initializer_list<int>
func_a( {1,2,3} ); // Illegal, U cannot be deduced because
// {1,2,3} is not considered an expression
}
Помимо этого особого случая, правила удержания одинаковы.