ejemplo compiler c++ pointers c++11 auto

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 myvector no está inicializado en su ejemplo y es probable que contenga basura) . Entonces, básicamente, puedes usar cualquiera de ellos. Preferiría 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í:

  1. 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 para auto* x = ... , usa

    template <class T> void foo(T*);

  2. Intenta resolver la llamada foo(initializer) y busca lo que se deduce para T Esto se sustituye en lugar de auto .

  3. 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 ...