2013-06-24 10 views
10

Ho imparato che dichiarare una variabile utilizzando auto in questo modoLa proprietà ref- e cv-stripping di `auto`.

auto var = expr; 

fondamentalmente è come prendere il tipo di expr e stripping &/& & -references e tutto constness primo livello e volatileness da esso. Questo significa che la riga sopra è esattamente uguale a equivalente al seguente?

std::remove_cv<std::remove_ref<decltype(expr)>::type>::type var = expr; 
+2

Potrebbe piacerti l'imminente 'decltype (auto)' in C++ 14 :-) –

+0

@KerrekSB Potresti fornire maggiori dettagli, per favore? – Ali

+0

È la deduzione del tipo di 'auto' combinata con la semantica di riferimento di 'decltype' - come in' decltype (auto) x = foo(); '. –

risposta

10

No, non è vero. auto var = expr; è più simile a passare expr in base al valore.

int x[1]; 
auto y = x; 

Questo rende y un int*.

Per lo più auto x = expr; si comporta come tipo di modello deduzione:

template <typename T> 
void f(T); 
int x[1]; 
f(x); // deduces T as int* 

E 'più simile std::decay<decltype(expr)> var = expr;.

+0

Quindi 'std :: decay :: type var = expr;' * esattamente * equivalente a 'auto var = expr'? –

+7

Non esattamente. Questo è C++: ha la regola che l'unica regola senza eccezioni è questa. 'auto x = [] {};' rende un tipo lambda, ma lambdas non può essere usato in 'decltype'. –

Problemi correlati