c++ - ejemplo - ¿Por qué decltype(auto) devuelve una referencia aquí?
auto en c (1)
Pienso (pensamiento) entiendo auto
. Lo mismo sobre decltype
. Sin embargo, en C ++ 14, uno puede tener una cosa diabólica como decltype(auto)
como el tipo de retorno de una función. Considera lo siguiente:
decltype(auto) foo()
{
int m = 1;
return m;
}
El tipo de retorno es int
, todo tiene sentido.
Sin embargo,
decltype(auto) foo()
{
int m = 1;
return (m);
}
devuelve int&
(es decir, referencia a int
).
No tengo absolutamente ninguna IDEA por qué sucede esto, ¡¿por qué estos paréntesis hacen alguna diferencia ?! Espero que alguien pueda arrojar algo de luz sobre esto.
PD: También he etiquetado con C++
ya que hay muchas más personas que verifican la etiqueta de C++14
que C++14
.
7.1.6.2 [dcl.type.simple]
- Para una expresión e, el tipo denotado por decltype (e) se define de la siguiente manera:
- si e es una expresión-id sin paréntesis o un acceso de miembro de clase sin paréntesis (5.2.5), decltype (e) es el tipo de la entidad nombrada por e. Si no existe tal entidad, o si e nombra un conjunto de funciones sobrecargadas, el programa está mal formado;
- de lo contrario, si e es un xvalor, decltype (e) es T &&, donde T es el tipo de e;
- de lo contrario, si e es un lvalor, decltype (e) es T &, donde T es el tipo de e;
- De lo contrario, decltype (e) es el tipo de e.
En tu ejemplo tienes return (m)
así que e
es (m)
. Ese no es un acceso sin expresión a la expresión id o al miembro de la clase, por lo que vamos a la segunda viñeta. No es un xvalor, así que vamos a la tercera viñeta. Es un valor l, por lo que el tipo es T&
donde T
es int
.