c++ - 当你完美转发时,typename T 变成 T& 或 T&&,但当你不这样做时,T 根本不是引用。如何?

标签 c++ templates c++11

我正在阅读有关完美转发的内容,这是我了解到的让我感到困惑的事情:
当你试图实现完美转发时,你会做这样的事情:

template<class T> // If I were to call foo with an l-value int, foo would look
void foo(T &&x);  // like this: void foo(int& &&x)

然后我想,等等,这是否意味着如果我这样做:

template<class T> // If I were to call foo with an l-value int, foo would look
void foo(T x);    // like this: void foo(int& x);

但事实并非如此。 foo 看起来像这样:void foo(int x);

我的问题:为什么在完美的转发函数中,T变成了T&或T&&,而在另一个函数中,T不是引用?有人可以告诉我具体的规则吗?我需要一些说明!

最佳答案

模板参数T如果它出现在 T&& 形式的函数参数中,则可以推导为引用类型

表单的函数模板:

  • template<class T> void f(T x)
    将推导出 T作为对象类型(x 是对象类型,因此按值传递)

  • template<class T> void f(T& x)
    将推导出 T作为对象类型(然后 x 具有左值引用类型)

  • template<class T> void f(T&& x)
    将推导出 T作为

    • 或者一个左值引用(因此 x 由于引用折叠规则而具有左值引用类型)
    • 作为对象类型(因此 x 具有右值引用类型)

How come in the perfect forwarding function, T turns into a T& or T&&, [...]

这是错误的。 T成为引用类型L& 对象类型 R 不是引用R&& .
T&&形式的函数参数于是就变成了

  • 或者L& (因为对左值引用添加右值引用仍然是左值引用,就像add_rvalue_reference<L&>::type仍然是L&)
  • 或者变成R&& (因为 add_rvalue_reference<R>::typeR&& )

关于c++ - 当你完美转发时,typename T 变成 T& 或 T&&,但当你不这样做时,T 根本不是引用。如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16192796/

相关文章:

c++ - ungetc 有 C++ 版本吗?

c++ - 如何推送现有/创建/实例化的类对象以在 Lua 脚本上使用?

c++ - 如何打印 Voronoi 图的面?

c++ - 给定带有可变参数模板的成员函数指针的类型推导

c++ - weak_ptr 是基类的,而 shared_ptr 是派生类的?

c++ - 绑定(bind)实用程序和模板化函数

c++ - system() 控制键盘

c++ - reference_wrapper 和 std::ref 是如何工作的?

c++ - 为什么存在用户声明的析构函数时生成移动构造函数?

c++ - 混合 VTK 和 SWIG Python