После определения типа инициализатора компилятор определяет тип, который заменит ключевое слово 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&&
может быть выведен либо в качестве ссылки или ссылки-значения 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&&
Я рекомендую прочитать эту статью [] (https://isocpp.org/blog/2012/11/universal-references-in-c11-scott-meyers) по ссылкам пересылки (ранее называемым универсальными ссылками). – TartanLlama
добавить 'auto && var3 = 10' в качестве ссылки на rvalue – bolov
Поскольку имена ссылок rvalue являются lvalues. – Pixelchemist