2012-09-03 9 views
5

Supponiamo che io sono un tipo T:C++ 11: ref standard per l'azione di `auto` sui tipi const e di riferimento

typedef ... T; 

e poi devo queste funzioni:

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

e poi li chiamano in questo modo:

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

Da quali sezioni/clausole della norma C++ 11 si può dedurre le dichiarazioni non-auto equivalenti di x11..x23 ?

+0

Ora tenere su. 'Typedef ... T;' rende qualsiasi compilatore normale sputa fuori gli errori di compilazione –

+1

@ BЈовић: '' ... in questo contesto è un segnaposto per qualsiasi tipo valido. (non aiutato dal fatto che '...' è anche C++ valido in alcuni posti) –

+0

Lì. Questo è stato facilmente risolto – sehe

risposta

5

E 'in §7.1.6.4 auto specificatore. Nei tuoi esempi di tipi di ritorno di funzione, si applicano le regole della deduzione degli argomenti del modello.

Paraquoting l'esempio rilevante dalla norma:

const auto &i = expr;

Il tipo di i è il tipo dedotta del parametro X nella chiamata f(expr) delle seguenti modello di funzione inventato:

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

Quindi io n tuoi esempi, i tipi di tutte le variabili x11 a x23 sono dedotte come T.

+0

cioè se 'modello g (T t);' di 'g (f())' e 'auto t = f()' comporterebbe lo stesso tipo di t in entrambi i casi? –

+0

@ AndrewTomazos-Fathomling l'esempio nello standard è 'auto const & i = expr' e' modello void f (const U & u); '. Qui, il tipo di' I' è il tipo dedotta di 'u' in' f (espr) '. – juanchopanza

+2

In particolare, ciò significa che il tipo di ciascuna variabile dedotto sarà' T'. –

Problemi correlati