ejemplo c++ auto c++14 decltype

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]

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