Требует ли ‘auto’ присваивания указателю типа в c ++ 11 ‘*’?

Учитывая, что моя переменная является указателем, если я назначу ее переменной типа «auto», могу ли я указать «*»?

std::vector<MyClass> *getVector(); //returns populated vector
//...

std::vector<MyClass> *myvector = getVector();  //assume has n items in it
auto newvar1 = myvector;

// vs:
auto *newvar2 = myvector;

//goal is to behave like this assignment:
std::vector<MyClass> *newvar3 = getVector();

Я немного запутался, как это auto работает в c ++ 11 (это новая функция в c ++ 11, верно?)

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

31

Решение

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 это тип pointee, например, std::vector<MyClass>и инициализатор должен быть адекватным.

В общем случае, если инициализатор не является списком инициализированных скобок, компилятор обрабатывает auto как это:

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

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

  3. Если в одной декларации больше деклараторов, это делается для всех них. Выведенный T должно быть одинаковым для всех них …

34

Другие решения

auto newvar1 = *myvector;

Это, вероятно, то, что вы хотите, что создает копию фактического вектора. Если вы хотите иметь ссылку, напишите auto& newvar1 = *myvector; или создать еще один указатель на использование того же вектора auto newvar1 = myvector;, Разница с вашей другой попыткой auto *newvar1 = myvector; является то, что последний когда-то заставляет myvector иметь тип указателя, поэтому следующий код завершается ошибкой:

std::vector<int> v1;
auto* v2 = v1; // error: unable to deduce ‘auto*’ from ‘v1’
2