左值和右值作为函数参数
lvalue and rvalue as function parameters
我正在尝试了解 C++ 中的左值和右值。
所以我将它们用作传递给函数的参数。
在第一种情况下,我有两个函数,第一个函数引用了一个 const int,在这种情况下,由于 "const"(参见 link),我可以将左值和右值都传递给第一个函数我不会有任何问题。
在第二个函数中,我不得不传递一个 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’
}
好的!
为什么如果第二个函数变成函数模板,如下例我也可以传递一个左值。
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
时,&&
不表示右值引用,而是推导其类型的引用,并且可以是右值或左值参考取决于扣除的结果。据说是转发参考
我正在尝试了解 C++ 中的左值和右值。
所以我将它们用作传递给函数的参数。 在第一种情况下,我有两个函数,第一个函数引用了一个 const int,在这种情况下,由于 "const"(参见 link),我可以将左值和右值都传递给第一个函数我不会有任何问题。 在第二个函数中,我不得不传递一个 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’
}
好的!
为什么如果第二个函数变成函数模板,如下例我也可以传递一个左值。
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
时,&&
不表示右值引用,而是推导其类型的引用,并且可以是右值或左值参考取决于扣除的结果。据说是转发参考