c++ - c++中模板的实例化

标签 c++ templates

正确:

template<typename T>
typename remove_reference<T>::type&& move(T&&d){
  return static_cast<typename remove_reference<T>::type&&>(d);
}

错误:

template<typename T>
T&& move(T&&d){
  return static_cast<typename remove_reference<T>::type&&>(d);
}

我不明白这些模板函数的实例化方式有何不同。这两个函数的返回类型有何不同?

最佳答案

这是 reference collapsing rules of C++11 的结果.

当你有类型 T && 时:

  • 如果 TU 那么你得到 U &&
  • 如果 TU & 那么你会得到 U & &&,它会折叠成 U &
  • 如果 TU && 那么你会得到 U && &&,它会折叠成 U &&

std::remove_reference 将从类型中“移除”左值引用或右值引用,导致 T &T && 变为T

所以,当 T 在你的情况下是 U & 那么返回类型是不同的:

  • 您的第一个示例返回 U & && 这实际上是 U & —— 根本不是我们想要的 std::move()返回!
  • 您的第二个示例返回 U &&

关于c++ - c++中模板的实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28086207/

相关文章:

c++ - 将屏幕绘图翻译到屏幕的另一部分

c++ - 无法理解为什么会发生段错误

c++ - 为什么我的 operator=(&&) 模板只绑定(bind)到 const 而不是 &&?

c++ - 在模板类中声明与 friend 相同的模板类?

c++ - "undefined reference to ` vtable.. "- How to know which method isn' t 定义了吗?

c++ - (QNativeSocketEngine) QObject : Cannot create children for a parent that is in a different thread

c++ - 是否可以在多 GPU 机器上执行 CUDA 程序的多个实例?

c++ - 模板类错误 C++

c++ - 将 typedef 作为类的非静态成员访问?

c++ - 如何专门化容器的功能模板?