Ответ 1
auto newvar1 = myvector;
// vs:
auto *newvar2 = myvector;
Оба они одинаковы и объявят указатель на std::vector<MyClass>
(указывая на случайное местоположение, поскольку . Таким образом, вы можете использовать любой из них. Я бы предпочел myvector
неинициализируется в вашем примере и, вероятно, содержит мусор)auto var = getVector()
, но вы можете пойти на auto* var = getVector()
, если считаете, что он подчеркивает намерение (что var
является указателем) лучше.
Я должен сказать, что я никогда не мечтал о подобной неопределенности, используя auto
. Я думал, что люди просто используют auto
и не думают об этом, что является правильным в 99% случаев - необходимость украшать auto
чем-то только со ссылками и cv-квалификаторами.
Однако есть небольшая разница между ними при незначительном изменении:
auto newvar1 = myvector, newvar2 = something;
В этом случае newvar2
будет указателем (и что-то тоже должно быть).
auto *newvar1 = myvector, newvar2 = something;
Здесь newvar2
- тип адресата, например. std::vector<MyClass>
, и инициализатор должен быть адекватным.
В общем случае, если инициализатор не является скопированным списком инициализаторов, компилятор обрабатывает auto
следующим образом:
-
Он создает объявление шаблона искусственной функции с одним аргументом точной формы декларатора, при замене
auto
на параметр шаблона. Итак, дляauto* x = ...
он используетtemplate <class T> void foo(T*);
-
Он пытается разрешить вызов
foo(initializer)
и смотрит, что выводится дляT
. Это заменяется вместоauto
. -
Если в объявлении больше деклараций, это делается для всех них. Выведенный
T
должен быть одинаковым для всех из них...