Я пытаюсь понять Lvalue и Rvalue в C ++.
Поэтому я использую их как параметры, передаваемые функциям.
В этом первом случае у меня есть две функции, первая имеет ссылку на const int, в этом случае благодаря «const» (см. ссылка на сайтЯ могу передать первой функции и 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’
}
Хорошо!
Почему, если вторая функция становится шаблоном функции, как в примере ниже, я также могу передать 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
}
Важно то, что T
был выведен, чтобы быть ссылкой. Так что если T
является const int&
тогда что T&&
то есть const int& &&
? Свертывание правила говорят, что это const int&
,
Так когда T
в T&&
выводится, что &&
не обозначает ссылку rvalue, но ссылку, тип которой выводится, и может быть либо ссылкой rvalue, либо lvalue в зависимости от результата вывода. Говорят, что это ссылка для пересылки.
Других решений пока нет …