compiler - ¿Las asignaciones de tipo "automático" de un puntero en c++ 11 requieren ''*''?
c++11 download (2)
auto newvar1 = *myvector;
Esto es probablemente lo que quiere, que crea una copia del vector real. Si desea tener una referencia, escriba auto& newvar1 = *myvector;
o para crear otro puntero al mismo vector use auto newvar1 = myvector;
. La diferencia con su otro intento auto *newvar1 = myvector;
es que este último fuerza a myvector a ser de tipo puntero, por lo que falla el siguiente código:
std::vector<int> v1;
auto* v2 = v1; // error: unable to deduce ‘auto*’ from ‘v1’
Dado que mi variable es un puntero, si lo asigno a una variable de tipo "auto", ¿especifico el "*"?
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();
Estoy un poco confundido sobre cómo funciona este auto
en c ++ 11 (esta es una nueva característica de c ++ 11, ¿verdad?)
Actualización: Revisé lo anterior para aclarar mejor cómo mi vector está realmente poblado en una función, y estoy tratando de asignar el puntero devuelto a una variable. Perdón por la confusion
auto newvar1 = myvector;
// vs:
auto *newvar2 = myvector;
Ambos son iguales y declararán un puntero a std::vector<MyClass>
(apuntando a una ubicación aleatoria, ya que . Entonces, básicamente, puedes usar cualquiera de ellos. Preferiría myvector
no está inicializado en su ejemplo y es probable que contenga basura) auto var = getVector()
, pero puede ir por auto* var = getVector()
si cree que acentúa mejor la intención (que var
es un puntero).
Debo decir que nunca soñé con una incertidumbre similar usando el auto
. Pensé que la gente simplemente usaría el auto
y no pensaría en eso, lo cual es correcto el 99% del tiempo: la necesidad de decorar el auto
con algo solo viene con referencias y cv-calificadores.
Sin embargo, hay una ligera diferencia entre los dos cuando se modifica ligeramente:
auto newvar1 = myvector, newvar2 = something;
En este caso, newvar2
será un puntero (y algo debe serlo también).
auto *newvar1 = myvector, newvar2 = something;
Aquí, newvar2
es el tipo de punta, por ejemplo. std::vector<MyClass>
, y el inicializador debe ser adecuado.
En general, si el inicializador no es una lista de inicializadores preparados, el compilador procesa de forma auto
así:
Produce una declaración de plantilla de función artificial con un argumento de la forma exacta del declarador, con
auto
reemplazado por el parámetro de plantilla. Entonces paraauto* x = ...
, usatemplate <class T> void foo(T*);
Intenta resolver la llamada
foo(initializer)
y busca lo que se deduce paraT
Esto se sustituye en lugar deauto
.Si hay más declaradores en una sola declaración, esto se hace para todos ellos. La
T
deducida debe ser la misma para todos ellos ...