Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;通过右引用传递的函数_C++_Function_Casting_Pass By Reference_Compile Time - Fatal编程技术网

C++ c++;通过右引用传递的函数

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);} 所以,我想知道我是否可以创建一个正确的引用并将其传递给函数?这就

我在看std::move函数的源代码。它所做的是删除引用并添加正确的引用(&&)

/**
*@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);
}