2012-09-03 12 views
5

Supongamos que tengo un tipo T:C++ 11: referencia estándar para la acción de `auto` en const y de referencia tipos

typedef ... T; 

y luego me tienen las siguientes funciones:

T f11(); 
T& f12(); 
T&& f13(); 
const T f21(); 
const T& f22(); 
const T&& f23(); 

y a continuación, llamar a ellos de esta manera:

auto x11 = f11(); 
auto x12 = f12(); 
auto x13 = f13(); 
auto x21 = f21(); 
auto x22 = f22(); 
auto x23 = f23(); 

de qué secciones/cláusulas de la norma C++ 11 se pueden deducir de las declaraciones no automóviles equivalentes de x11..x23 ?

+0

Ahora espera. 'typedef ... T;' hace que cualquier compilador común escupe errores de compilación –

+1

@ BЈовић: '...' en este contexto es un marcador de posición para cualquier tipo válido. (no ayudado por el hecho de que '...' también es válido C++ en algunos lugares) –

+0

Allí. Eso se solucionó fácilmente – sehe

Respuesta

5

Es en el §7.1.6.4 auto especificador. En sus ejemplos de tipos de devolución de funciones, se aplican las reglas de deducción de argumento de la plantilla.

Paraquoting el ejemplo relevante de la norma:

const auto &i = expr;

El tipo de i es el tipo deducida del parámetro X en la llamada f(expr) de la siguiente plantilla de función inventado:

template <class AUTO> void f(const AUTO& X);

So i n sus ejemplos, los tipos de todas sus variables x11 a x23 se deducen como T.

+0

Eso es si 'plantilla g (T t);' que 'g (f())' y 'auto t = f()' daría como resultado el mismo tipo de t en ambos casos? –

+0

@ AndrewTomazos-Fathomling el ejemplo en el estándar es 'const auto & i = expr' y' plantilla void f (const U & u); '. Aquí, el tipo de' i' es el tipo deducido de 'u' en' f (expr) '. – juanchopanza

+2

En particular, esto significa que el tipo de cada variable deducida será' T'. –

Cuestiones relacionadas