Est-ce que "auto", le type d'affectations d'un pointeur en c++11 require '*'?
Donné ma variable étant un pointeur, si je l'affecter à une variable de "auto" type, dois-je préciser les "*" ?
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();
Je suis un peu confus sur la façon dont cette auto
fonctionne en c++11 (ce qui est une nouvelle fonctionnalité de c++11, à droite?),
Mise à jour: j'ai revu le ci-dessus afin de mieux clarifier la façon dont mon vecteur est vraiment peuplé de dans une fonction, et je suis juste en train d'affecter le pointeur retourné à une variable. Désolé pour la confusion
- Le but n'est pas logique; que la cession ne sera pas compiler en C++.
auto_ptr
est obsolète maintenant...- J'aurais du précisé que je suis en train de créer (sur le tas) et le remplissage d'un vecteur dans une fonction, puis de retourner un pointeur vers ce vecteur, et que vous voulez créer une variable pour stocker le pointeur. J'ai édité ma question à élaborer.
Vous devez vous connecter pour publier un commentaire.
Ces deux sont la même et déclarer un pointeur vers
std::vector<MyClass>
(pointant au hasard, depuis. Donc, fondamentalement, vous pouvez utiliser l'un quelconque d'entre eux. Je préfèremyvector
est non initialisée dans votre exemple, et contient probablement des ordures)auto var = getVector()
, mais vous pouvez aller pourauto* var = getVector()
si vous pensez qu'il insiste sur l'intention (quivar
est un pointeur) mieux.je dois dire que je n'ai jamais rêvé de semblable uncertainity à l'aide de
auto
. Je pensais que les gens seraient simplement utiliserauto
et de ne pas y penser, ce qui est correct 99 % du temps, - la nécessité de décorerauto
avec quelque chose qui ne vient qu'avec les références et cv-qualificatifs.Cependant, il y est légère différence entre les deux lorsque modifie légèrement:
Dans ce cas,
newvar2
sera un pointeur (et quelque chose doit être trop).Ici,
newvar2
est le pointee type, par exemple.std::vector<MyClass>
, et l'initialiseur, doivent être suffisants.En général, si l'initialisation n'est pas un arc-boutée liste d'initialiseur, le compilateur traite
auto
comme ceci:Il produit artificiel de la fonction de modèle de déclaration avec un argument de la forme exacte de la déclaration, avec
auto
remplacé par le paramètre de modèle. Donc, pourauto* x = ...
, il utiliseIl tente de résoudre l'appel
foo(initializer)
, et regarde ce qui se déduit deT
. Ceci se substituer en arrière à la place deauto
.Si il y a plus de declarators dans un seul déclarations, cela se fait pour tous. Le déduit
T
doit être la même pour tous...T=int*
, puis une spécialisation pour les pointeurs en déduiraitT=int
. Pourauto* p = &i;
le déduitint
type est ensuite renforcée " avec le pointeur de la déclaration de la partie deauto*
, produisant le même type que dansauto p = &i
.C'est probablement ce que vous voulez, ce qui crée une copie du vecteur. Si vous voulez avoir une référence au lieu d'écrire
auto& newvar1 = *myvector;
ou de créer un autre pointeur vers le même vecteur d'utilisationauto newvar1 = myvector;
. La différence pour votre autre tentativeauto *newvar1 = myvector;
est que la dernière fois, les forces myvector pour être de type pointeur, donc le code suivant échoue: