resueltos - Confusión sobre la palabra clave auto en C++
funciones en c++ ejemplos (4)
Esta pregunta ya tiene una respuesta aquí:
Estoy confundido por el siguiente código:
#include <iostream>
using namespace std;
int *foo()
{
//Operation
}
int main ()
{
auto int ret = foo();
}
Compilé el código anterior bajo GCC, pero obtuve el siguiente error:
error: two or more data types in declaration of ''ret''
auto int ret = foo();
Pero, si quito el tipo int
, así:
auto ret = foo();
entonces se ejecuta con éxito.
auto
es una clase de almacenamiento e int
es un tipo de datos , entonces ¿por qué aparece el error "dos o más tipos de datos" en el primer caso?
auto
es una clase de almacenamiento
Eso solía ser cierto antes de C ++ 11 pero ya no.
A partir de C ++ 11, el significado de la palabra ha sido cambiado. Ahora se utiliza para deducir tipos automáticamente. Consulte http://www.stroustrup.com/C++11FAQ.html#auto .
¿Por qué en el primer caso recibí un error "dos o más tipos de datos"?
Mediante el uso
auto int ret = foo();
está intentando especificar dos tipos para ret
, uno deducido y otro explícitamente especificado.
Si desea usar un tipo explícitamente especificado, puede usar:
int ret = *foo(); // Since foo() returns a pointer.
o
int* ret = foo();
o puedes dejar que el compilador deduzca el tipo usando:
auto ret = foo();
Tu escribiste eso:
auto
es una clase de almacenamiento
pero esto no es más cierto en C++11 (o posterior). La palabra clave auto
se ha doc para algo completamente diferente (algún tipo de inferencia de tipo limitado). La antigua clase de almacenamiento auto
C ++ 03 o C99 es ahora (en C ++ 11) siempre implícita y no debe usar la palabra clave auto
.
(Si te gusta la inferencia de tipos, C ++ 11 no lo está haciendo muy bien, pero C ++ 14 o C ++ 17 han progresado en eso; Ocaml tiene una inferencia de tipo Hindley-Milner mucho más poderosa e interesante, que es más " global "; por eso escribí" algún tipo limitado ")
auto NO es una clase de almacenamiento (no más desde C ++ 11) C ++ 11 trae la palabra clave que permite al compilador inferir cuál es el tipo requerido para la variable que está declarando.
así que básicamente hacer auto int myVar es tan inválido como la cadena doble myVar2 o bool long myVar3 ... la variable solo puede tener un tipo de datos que lo define, y en su caso, la palabra clave auto hace eso ...
Cómo deshacerse del error:
Elimine el tipo int y simplemente use auto , ya que esto permitirá al compilador * AUTO *** inferir de manera sistemática que el tipo de variable ** ret es exactamente eso de lo que foo()
devuelve :) ¡simplemente genial!
auto ret = foo();
desde el doc :
Para las variables, especifica que el tipo de la variable que se está declarando se deducirá automáticamente de su inicializador. Para las funciones, especifica que el tipo de retorno es un tipo de retorno final o se deducirá de sus declaraciones de retorno (desde C ++ 14). para los parámetros de plantilla que no son de tipo, especifica que el tipo se deducirá del argumento
auto
no es una clase de almacenamiento Antes solía ser C ++ 11. Pero fue completamente inútil, por lo que la palabra clave se re-propuso para permitir la inferencia automática de tipos. Así que cuando dices:
auto int ret = foo();
Básicamente, está declarando que el objeto tiene 2 tipos (o posiblemente el mismo tipo dos veces), y eso es un error. Y cuando dices:
auto ret = foo();
El tipo de ret
está determinado por la función que devuelva foo
, que es int*
en este caso.