auto&& переменная не является ссылкой на rvalue

Почему auto&& не является ссылкой на rvalue?

Widget&& var1 = Widget(); // rvalue reference
auto&& var2 = var1; //var2 not rvalue reference

ниже приведен справочный пример rvalue

void f(Widget&& param); // rvalue reference
Widget&& var1 = Widget(); // rvalue reference

Почему var2 не является ссылкой на rvalue, а f и var2 являются ссылками на rvalue?


person Ajay yadav    schedule 20.01.2016    source источник
comment
Я рекомендую прочитать эту статью на ссылки пересылки (ранее известные как универсальные ссылки).   -  person TartanLlama    schedule 20.01.2016
comment
добавить auto&& var3 = 10 в качестве ссылки rvalue   -  person bolov    schedule 20.01.2016
comment
Поскольку именованные ссылки rvalue являются lvalue.   -  person Pixelchemist    schedule 20.01.2016
comment
Ссылка lvalue и ссылка rvalue относятся к тому, как ссылка связана. После привязки это просто ссылка, больше нет никаких различий, кроме результата decltype. Пожалуйста, обновите свой вопрос, чтобы показать, как вы определяете не ссылку rvalue   -  person M.M    schedule 21.01.2016


Ответы (2)


Как только тип инициализатора определен, компилятор определяет тип, который заменит ключевое слово 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&& является эквивалентом объявлений для ссылок переадресации (с идентичными правилами вывода). Таким образом, он будет преобразован в ссылку lvalue, когда инициализатором является lvalue. Однако var — это lvalue (поскольку это имя переменной), поэтому var2 — это ссылка на lvalue.

person Columbo    schedule 20.01.2016