2016-01-20 2 views
2

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

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 ссылка, но е и var2 являются RValue ссылки?

+2

Я рекомендую прочитать эту статью [] (https://isocpp.org/blog/2012/11/universal-references-in-c11-scott-meyers) по ссылкам пересылки (ранее называемым универсальными ссылками). – TartanLlama

+1

добавить 'auto && var3 = 10' в качестве ссылки на rvalue – bolov

+2

Поскольку имена ссылок rvalue являются lvalues. – Pixelchemist

ответ

0

После определения типа инициализатора компилятор определяет тип, который заменит ключевое слово 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&& 
4

auto&& - эквивалент декларации пересылки (с идентичными правилами вычета). Таким образом, это будет выводиться на ссылку lvalue, когда инициализатор является lvalue. Однако var является значением lvalue (так как это имя переменной), поэтому var2 является ссылкой на lvalue.

Смежные вопросы