¿Por qué decltype (auto) devuelve una referencia aquí?
Creo (pensamiento) entiendo auto
. Lo mismo sobre decltype
. Sin embargo, en C++14, uno puede tener algo diabólico como decltype(auto)
como el tipo de retorno de una función. Considere lo siguiente:
decltype(auto) foo()
{
int m = 1;
return m;
}
El tipo devuelto es int
, todo tiene sentido.
Sin embargo,
decltype(auto) foo()
{
int m = 1;
return (m);
}
Devuelve int&
(es decir, referencia a int
).
NO tengo ni IDEA de por qué sucede esto, ¡por qué estos paréntesis hacen alguna diferencia en absoluto!? Espero que alguien pueda arrojar algo de luz sobre este.
PD: También he etiquetado con C++
ya que hay muchas más personas que comprueban la etiqueta C++
que C++14
.
1 answers
7.1.6.2 [dcl.tipo.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 compaginar o un acceso miembro de clase sin compaginar (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 xvalue, decltype (e) es T&&, donde T es el tipo de e;
- de lo contrario, si e es un lvalue, 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)
. Eso no es una expresión de identificación o un acceso de miembro de clase sin compaginar, así que vamos a la segunda viñeta. No es un xvalue así que vamos a la tercera bala. Es un lvalue, por lo que el tipo es T&
donde T
es int
.
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
2014-12-18 23:29:44