Назначения типа «auto» указателя в c ++ 11 требуют «*»?
Если моя переменная является указателем, если я назначаю ее переменной типа «auto», задаю ли я «*»?
std::vector *getVector(); //returns populated vector //... std::vector *myvector = getVector(); //assume has n items in it auto newvar1 = myvector; // vs: auto *newvar2 = myvector; //goal is to behave like this assignment: std::vector *newvar3 = getVector();
Я немного смущен тем, как этот auto
работает в c ++ 11 (это новая функция для c ++ 11, правда?)
Обновление: я пересмотрел выше, чтобы лучше понять, как мой вектор действительно заполняется функцией, и я просто пытаюсь назначить возвращаемый указатель на переменную. Извините за путаницу
- Почему cout печатает массивы char по-разному от других массивов?
- Возврат указателя локальной переменной C ++
- Почему я должен использовать указатель, а не сам объект?
- Возвращаемые массивы / указатели от функции
- Что означает `dword ptr`?
- Указатель против массива в C, нетривиальная разность
- Как использовать глобальный var для файлов в пакете?
- C ++ Доступный элемент classа из указателя базового classа
- Литье указателя не дает lvalue. Зачем?
- Зачем использовать двойной указатель? или Зачем использовать указатели для указателей?
- Используется для нескольких уровней разметки указателя?
- Преобразование многомерных массивов в указатели в c ++
- Почему std :: cout конвертирует изменчивые указатели в bool?
auto newvar1 = myvector; // vs: auto *newvar2 = myvector;
Оба они одинаковы и объявят указатель на std::vector
(указывая на случайное местоположение, поскольку , Таким образом, вы можете использовать любой из них. Я бы предпочел бы 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
, и инициализатор должен быть адекватным.
В общем случае, если инициализатор не является скопированным списком инициализаторов, компилятор обрабатывает auto
:
-
Он создает объявление шаблона искусственной функции с одним аргументом точной формы декларатора, при этом
auto
заменяется параметром шаблона. Таким образом, дляauto* x = ...
, он используетtemplate
void foo(T*); -
Он пытается разрешить вызов
foo(initializer)
и смотрит, что выводится дляT
Это заменяется вместоauto
. -
Если в декларациях больше деклараций, это делается для всех из них. Вывод
T
должен быть одинаковым для всех из них …
auto newvar1 = *myvector;
Вероятно, это то, что вы хотите, что создает копию фактического вектора. Если вы хотите иметь ссылку, вместо этого напишите auto& newvar1 = *myvector;
или создать другой указатель на один и тот же вектор, используя auto newvar1 = myvector;
, Разница с вашей другой попыткой auto *newvar1 = myvector;
заключается в том, что последний однажды заставляет myvector иметь тип указателя, поэтому следующий код не выполняется:
std::vector v1; auto* v2 = v1; // error: unable to deduce 'auto*' from 'v1'