Учитывая, что моя переменная является указателем, если я назначу ее переменной типа «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, верно?)
Обновить: Я пересмотрел выше, чтобы лучше прояснить, как мой вектор действительно заполняется в функции, и я просто пытаюсь присвоить возвращаемый указатель на переменную. Извините за путаницу
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
как это:
Он создает искусственное объявление шаблона функции с одним аргументом точной формы объявления, с auto
заменяется параметром шаблона. Таким образом, для auto* x = ...
, оно использует
template <class T> void foo(T*);
Пытается разрешить звонок foo(initializer)
и смотрит, что выводится для T
, Это заменяется обратно вместо auto
,
Если в одной декларации больше деклараторов, это делается для всех них. Выведенный T
должно быть одинаковым для всех них …
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’