Confusión sobre la palabra clave auto en C++ [duplicar]


Esta pregunta ya tiene una respuesta aquí:

Estoy confundido por el siguiente fragmento de 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 elimino int escriba, así:

auto ret = foo();

Entonces se ejecuta con éxito.

auto es una clase de almacenamiento y int es un tipo de datos , entonces ¿por qué recibo el error "dos o más tipos de datos" en el primer caso?

Author: rsp, 2017-04-12

4 answers

auto no es una clase de almacenamiento. Solía serlo, antes de C++11. Pero era completamente inútil, por lo que la palabra clave fue re-utilizada 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 lo que devuelve la función foo, que es int* en este caso.

 43
Author: Benjamin Lindley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-12 06:25:20

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 cambiado. Ahora se utiliza para deducir automáticamente los tipos. Véase http://www.stroustrup.com/C++11FAQ. html # auto .

¿Por qué en el primer caso tengo un error "dos o más tipos de datos"?

Usando

auto int ret = foo();

Usted está tratando de especificar dos tipos para ret one uno deducido y el otro explícitamente especificado.

Si desea utilizar un tipo especificado explícitamente, puede utilizar:

int ret = *foo(); // Since foo() returns a pointer.

O

int* ret = foo();

O puede dejar que el compilador deduzca el tipo usando:

auto ret = foo();  
 32
Author: R Sahu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-12 06:34:05

Auto NO es una clase de almacenamiento (ya no desde C++11) C++11 trae la palabra clave permitiendo al compilador inferir cuál es el tipo requerido para la variable que está declarando.

Así que básicamente hacer auto int myVares tan inválido como string double myVar2o bool long myVar3... la variable solo puede tener un tipo de datos que la defina, y en su caso la palabra clave auto hace eso...

Cómo deshacerse del error:

Elimine el tipo int y simplemente use auto , haciendo esto le permitirá al compilador *AUTO***inferir máticamente que el tipo de la variable * * ret es exactamente eso de lo que foo() devuelve:) ¡simplemente genial!

auto ret = foo();

Del doc :

Para variables, especifica que el tipo de la variable que está siendo declarado se deducirá automáticamente de su inicializador. Para funciones, especifica que el tipo de retorno es un tipo de retorno final o se deducirá de su devolución sentencias (desde C++14). para no tipo parámetros de plantilla, especifica que el tipo se deducirá de la argumento

 10
Author: ΦXocę 웃 Пepeúpa ツ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-12 17:24:42

Usted escribió que:

auto es una clase de almacenamiento

Pero esto ya no es cierto en C++11 (o posterior). La palabra clave auto ha sido reutilizada para algo completamente diferente (algún tipo limitado de inferencia de tipo ). La antigua clase de almacenamiento C++03 o C99 auto es ahora (en C++11) siempre implícita y debería no 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 ha progresado en él; Ocaml tiene una inferencia de tipo Hindley-Milner mucho más poderosa e interesante que es más "global"; es por eso que escribí "algún tipo limitado")

 4
Author: Basile Starynkevitch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-12 12:08:26