Назначения типа «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, правда?)

Обновление: я пересмотрел выше, чтобы лучше понять, как мой вектор действительно заполняется функцией, и я просто пытаюсь назначить возвращаемый указатель на переменную. Извините за путаницу

 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 :

  1. Он создает объявление шаблона искусственной функции с одним аргументом точной формы декларатора, при этом auto заменяется параметром шаблона. Таким образом, для auto* x = ... , он использует

     template  void foo(T*); 
  2. Он пытается разрешить вызов foo(initializer) и смотрит, что выводится для T Это заменяется вместо auto .

  3. Если в декларациях больше деклараций, это делается для всех из них. Вывод 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' 
  • Каковы препятствия для понимания указателей и что можно сделать для их преодоления?
  • Как эта ссылка осуществляется внутри страны?
  • В чем причина использования двойного указателя при добавлении узла в связанный список?
  • С массивами, почему это так, == 5 ?
  • Каковы различия между переменной указателя и ссылочной переменной в C ++?
  • Указатель функций, отлитый от другой подписи
  • Выражения указателя: * ptr ++, * ++ ptr и ++ * ptr
  • Получение размера malloc только с возвращенным указателем
  • Когда имя массива или имя функции «преобразуется» в указатель? (в С)
  • Свободно (ptr), где ptr является NULL поврежденной памятью?
  • Использование fseek с указателем файла, указывающим на stdin
  • Interesting Posts

    Создание видеороликов MP4, готовых для потоковой передачи HTTP

    Как заблокировать программу от доступа к Интернету?

    Являются ли текстовые объявления Google Chrome вредоносными программами?

    Преобразовать список Scala в кортеж?

    SPARQL: существует ли какой-либо путь между двумя узлами?

    Как просмотреть «заархивированную» историю Google Chrome, то есть историю старше трех месяцев?

    MVC Как отобразить изображение байтового массива из модели

    Событие, зарегистрированное в CheckedListBox?

    Универсальный ЭЛТ-модуль MSVC 2015 для локального развертывания приложений

    Настройка предпочтительного сетевого адаптера для просмотра

    Как преобразовать коэффициент в integer \ numeric без потери информации?

    Использование принтера в Dosbox

    Как удалить конечные и ведущие пробелы для пользовательского ввода в пакетном файле?

    Excel. Как найти общие текстовые значения из нескольких (> 2) столбцов?

    Как обновить значение, учитывая ключ в jash hashmap?

    Давайте будем гением компьютера.