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
autoreemplazado 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 paraTEsto se sustituye en lugar deauto.Si hay más declaradores en una sola declaración, esto se hace para todos ellos. La
Tdeducida debe ser la misma para todos ellos ...