lvalue и rvalue как параметры функции - PullRequest
0 голосов
/ 11 декабря 2018

Я пытаюсь понять Lvalue и Rvalue в C ++.

Поэтому я использую их как параметры, передаваемые функциям.В этом первом случае у меня есть две функции, первая имеет ссылку на const int, в этом случае благодаря «const» (см. link ) я могу передать первой функции как Lvalue, так и Rvalueи у меня не будет проблем.Во второй функции вместо этого я обязан передать Rvlaue, иначе я получаю описанную ошибку.

void f1(const int& n){cout<<"[Lvalue]"<<endl;}
void f2(int&& n){cout<<"[Rvalue]"<<endl;}

int main()
{   
    const int n = 10;
    f1(n);
    f2(n);  //error: cannot bind rvalue reference of type ‘int&&’ to lvalue of type ‘const int’

}

ok!

Почему, если вторая функция становится шаблоном функции, как в примерениже я также могу передать Lvalue.

void f1(const int& n){cout<<"[Lvalue]"<<endl;}
template<class T>
void f2(T&& n){cout<<"[Rvalue]"<<endl;}

int main()
{   
    const int n = 10;
    f1(n);
    f2(n); //ok
}

1 Ответ

0 голосов
/ 11 декабря 2018

Что важно, так это то, что T был выведен как ссылка.Итак, если T равно const int&, то что такое T&&, то есть const int& &&? Свертывание ссылки правила говорят, что это const int&.

Итак, когда T в T&& выводится, то && обозначает не ссылку на значение, а ссылкучей тип выводится и может быть либо rvalue, либо lvalue ссылкой в ​​зависимости от результата вывода.Говорят, что это ссылка для пересылки.

...