c++ c++11 decltype

c++ - ¿Qué es decltype y cómo se usa?



c++11 (1)

decltype es una forma de especificar un tipo: le das una expresión y decltype te devuelve un tipo que corresponde al tipo de expresión. Específicamente, decltype(e) es el siguiente tipo:

  • Si e es el nombre de una variable, es decir, una "expresión-id", entonces el tipo resultante es el tipo de la variable.

  • De lo contrario, si e evalúa a un valor l de tipo T , entonces el tipo resultante es T & , y si e evalúa a un valor de tipo T , entonces el tipo resultante es T

La combinación de estas reglas con las reglas de colapso de referencia le permite dar sentido a decltype(e) && , que siempre es una referencia "adecuada". (C ++ 14 también agrega decltype(auto) para darle la deducción de tipo de auto combinada con la semántica de la categoría de valor de decltype ).

Ejemplos:

int foo(); int n = 10; decltype(n) a = 20; // a is an "int" [id-expression] decltype((n)) b = a; // b is an "int &" [(n) is an lvalue] decltype(foo()) c = foo(); // c is an "int" [rvalue] decltype(foo()) && r1 = foo(); // int && decltype((n)) && r2 = n; // int &

Podría valer la pena destacar la diferencia entre auto y decltype : auto funciona en tipos , y decltype funciona en expresiones .

No debería estar viendo o usando decltype en la programación "día a día". Es más útil en el código genérico (con plantilla) de la biblioteca, donde la expresión en cuestión no se conoce y depende de un parámetro. (Por el contrario, el auto se puede usar generosamente en todo el lugar). En resumen, si eres nuevo en la programación, probablemente no necesites usar decltype por algún tiempo.

No he podido encontrar una buena explicación de decltype. Por favor, dígame, como programador principiante, qué hace y por qué es útil.

Por ejemplo, estoy leyendo un libro que hizo la siguiente pregunta. ¿Puede alguien explicarme la respuesta y por qué, junto con algunos buenos ejemplos (para principiantes)?

¿Cuál sería el tipo de cada variable y qué valor tendría cada variable cuando el código termine?

int a = 3, b = 4; decltype(a) c = a; decltype((b)) d = a; ++c; ++d;

Una explicación línea por línea sería muy útil.