2013-06-24 9 views
10

dowiedziałem się, że deklarując zmienną przy użyciu funkcji Auto w ten sposóbWłaściwość ref-and cv-stripping dla `auto`.

auto var = expr; 

zasadzie jest jak rodzaj expr i odpędzania &/& & -references i wszystko constness najwyższego poziomu i volatileness od niego. Czy to oznacza, że ​​powyższa linia to dokładnie odpowiednik następującego?

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

Może Ci się spodobać nadchodzący 'decltype (auto)' w C++ 14 :-) –

+0

@KerrekSB Czy mógłbyś podać więcej szczegółów? – Ali

+0

Jest to dedukcja typu "auto" w połączeniu z semantyką odniesienia 'decltype' - jak w' decltype (auto) x = foo(); '. –

Odpowiedz

10

Nie, to nieprawda. auto var = expr; jest bardziej podobny do przekazywania wartości expr.

int x[1]; 
auto y = x; 

To sprawia y się int*.

Głównie auto x = expr; zachowuje się jak typ szablonu odliczenia:

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

To jest bardziej jak std::decay<decltype(expr)> var = expr;.

+0

Podobnie jest z 'std :: decay :: type var = expr;' * dokładnie * równoważne 'auto var = expr'? –

+7

Niezupełnie. To jest C++: obowiązuje zasada, że ​​jedyną regułą bez wyjątków jest ta. 'auto x = [] {};' tworzy typ lambda, ale lambdas nie może być użyty w 'decltype'. –

Powiązane problemy