¿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.

Author: vsoftco, 2014-12-19

1 answers

7.1.6.2 [dcl.tipo.simple]

  1. 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.

 29
Author: Jonathan Wakely,
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