Как только тип инициализатора определен, компилятор определяет тип, который заменит ключевое слово auto
, используя правила вывода аргумента шаблона из вызова функции (подробности см. в разделе вывод аргумента шаблона#Другие контексты). Ключевое слово auto
может сопровождаться модификаторами, такими как const
или &
, которые будут участвовать в выводе типа.
Например, учитывая
const auto& i = expr;
Тип i
в точности совпадает с типом аргумента u
в воображаемом
template template<class U>
void f(const U& u)
Если вызов функции f(expr)
был скомпилирован.
В общем, можно думать так, как показано ниже.
template template<class U>
void f(paramtype u)
Следовательно, auto&&
может быть выведено либо как ссылка lvalue, либо как ссылка rvalue в соответствии с инициализатором.
В вашем случае воображаемый шаблон будет выглядеть так
template template<class U>
void f(U&& var2){}
f(var1)
Здесь var1
называется rvalue, которое обрабатывается как lvalue, поэтому var2
будет выводиться как lvalue.
Рассмотрим следующие примеры:
auto&& var2 = widget() ; //var2 is rvalue reference here .
int x=10;
const int cx=10;
auto&& uref1 = x; // x is int and lvalue, so uref1's type is int&
auto&& uref2 = cx; // cx is const int and lvalue, so uref2's type is const int&
auto&& uref3 = 27; // 27 is int and rvalue, so uref3's type is int&&
person
SACHIN GOYAL
schedule
20.01.2016
auto&& var3 = 10
в качестве ссылки rvalue - person bolov   schedule 20.01.2016decltype
. Пожалуйста, обновите свой вопрос, чтобы показать, как вы определяете не ссылку rvalue - person M.M   schedule 21.01.2016