首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过正确引用混淆传递的c++函数

通过正确引用混淆传递的c++函数
EN

Stack Overflow用户
提问于 2018-07-19 11:37:24
回答 1查看 255关注 0票数 2

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

代码语言:javascript
复制
/**
*  @brief  Convert a value to an rvalue.
*  @param  __t  A thing of arbitrary type.
*  @return The parameter cast to an rvalue-reference to allow moving it.
*/
template<typename _Tp>
  constexpr typename std::remove_reference<_Tp>::type&&
  move(_Tp&& __t) noexcept
  { return static_cast<typename std::remove_reference<_Tp>::type&&>(__t); }

所以,我想知道我能不能做一个正确的引用并把它传递给函数?所以,这里是:

代码语言:javascript
复制
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);
}

产出: 112

我发现x是int的类型&因为前两个f1做同样的事情。但是,第三个呢?这不是一个整数吗?为什么我必须static_cast它才能像正确的引用一样使用它?我知道在"c++模板完整指南“中有一个clam,即:

移动语义不是自动传递的这一事实是有意的,也是重要的。如果不是这样的话,当我们第一次在函数中使用它时,我们就会失去可移动物体的价值。

我仍然好奇他们为什么在编译时选择不同的函数,即使他们有相同的类型?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-19 11:43:45

你混淆了类型和价值范畴,它们是不同的东西。

作为一个命名变量,x的值类别是lvalue,(它的类型是int&&。)lvalue可以绑定到lvalue-引用,但不能绑定到rvalue-引用。因此,给定f1(x);,将选择f1(int&)

要使f1(int&&)被调用,您需要将它转换为rvalue。第一个和第二个选择f1(int&&),因为显式转换使rvalue表达式(更确切地说是xvalue表达式);可以绑定到rvalue-引用。std::move也以类似的方式工作。

以下表达式为xvalue表达式:

  • 函数调用或重载操作符表达式,其返回类型为对对象(如std::move(x))的rvalue引用;
  • ..。
  • 对对象类型(如static_cast<char&&>(x))的引用进行转换的表达式;
  • ..。
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51421707

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档