2013-06-24 2 views
10

я узнал, что объявление переменной с помощью автоматического таким образомСвойство ref и cv-вскрытия `auto`.

auto var = expr; 

в основном как принимать тип expr и зачистки &/& & -references и все верхнего уровня константность и volatileness от него. Означает ли это, что указанная выше строка равна точно эквивалентно приведенному ниже?

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

Вам может понравиться предстоящий 'decltype (auto)' в C++ 14 :-) –

+0

@KerrekSB Не могли бы вы предоставить более подробную информацию, пожалуйста? – Ali

+0

Это дедукция типа 'auto' в сочетании с ссылочной семантикой' decltype' - как в 'decltype (auto) x = foo();'. –

ответ

10

Нет, это неправда. auto var = expr; больше нравится проходить expr по стоимости.

int x[1]; 
auto y = x; 

Это делает y в int*.

В основном auto x = expr; ведет себя как тип шаблона дедукции:

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

Это больше похоже std::decay<decltype(expr)> var = expr;.

+0

Итак, 'std :: decay :: type var = expr;' * точно * эквивалентно 'auto var = expr'? –

+7

Не совсем. Это C++: он имеет правило, что единственным правилом без исключений является это. 'auto x = [] {};' делает лямбда-тип, но lambdas нельзя использовать в 'decltype'. –