C++ c++;通过右引用传递的函数
我在看std::move函数的源代码。它所做的是删除引用并添加正确的引用(&&)C++ c++;通过右引用传递的函数,c++,function,casting,pass-by-reference,compile-time,C++,Function,Casting,Pass By Reference,Compile Time,我在看std::move函数的源代码。它所做的是删除引用并添加正确的引用(&&) /** *@brief将值转换为右值。 *@param_u______________________________。 *@将参数强制转换为右值引用以允许移动它。 */ 模板 constexpr typename std::remove_reference::type&& 移动(&&t)不例外 {return static_cast(__t);} 所以,我想知道我是否可以创建一个正确的引用并将其传递给函数?这就
/**
*@brief将值转换为右值。
*@param_u______________________________。
*@将参数强制转换为右值引用以允许移动它。
*/
模板
constexpr typename std::remove_reference::type&&
移动(&&t)不例外
{return static_cast(__t);}
所以,我想知道我是否可以创建一个正确的引用并将其传递给函数?这就是:
void f1(int&&) { std::cout << 1; }
void f1(int&) { std::cout << 2; }
int main() {
int&& x = 1;
f1(static_cast<decltype(x)>(x));
f1(static_cast<int&&>(x));
f1(x);
}
voidf1(int&){std::cout你混淆了类型,它们是不同的东西
作为命名变量,x
的值类别为左值(其类型为int&
),左值可以绑定到左值引用,但不能绑定到右值引用。因此,给定f1(x);
,将选择f1(int&)
要获得要调用的f1(int&)
需要将其转换为rvalue。第一个和第2个选择f1(int&)
,因为显式转换使rvalue表达式(更精确地说是xvalue表达式);它可以绑定到rvaluereference。并且std::move
也以类似的方式工作
以下表达式是xvalue表达式:
- 函数调用或重载运算符表达式,其返回类型为对对象的右值引用,例如
std::move(x)
- 用于对对象类型进行右值引用的强制转换表达式,例如
static_cast(x)
啊..我得到了u。类型和值类别是不同的。非常感谢。@ForrestSun是的,当然。
void f1(int&&) { std::cout << 1; }
void f1(int&) { std::cout << 2; }
int main() {
int&& x = 1;
f1(static_cast<decltype(x)>(x));
f1(static_cast<int&&>(x));
f1(x);
}