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 tipoT
, entonces el tipo resultante esT &
, y sie
evalúa a un valor de tipoT
, entonces el tipo resultante esT
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.