c++ - 使用通用引用时的类型推导

标签 c++ c++14 rvalue-reference lvalue type-deduction

谁能帮我理解为什么会输出以下代码

template< typename T >
void check()
{
  std::cout << "unknow type" << std::endl;
}

template<>
void check<int>()
{
  std::cout << "int" << std::endl;
}

template<>
void check<int&>()
{
  std::cout << "int&" << std::endl;
}

template<>
void check<int&&>()
{
  std::cout << "int&&" << std::endl;
}

template< typename T >
void bar( T&& a )
{
  check<T>();
}

int main()
{
  bar(0);

  int a = 0;
  bar( a );
}

int
int&

不是

int&&
int&

从我的角度来看,右值引用保留为右值引用,左值引用保留为左值引用似乎更直观,但是,似乎只有左值引用保留为左值引用和右值成为非引用值。 这背后的动机/想法是什么?

最佳答案

bar(0);调用特化 bar<int>(int&&)T推导为 int , 所以 check<T>()check<int>() .参数类型为T&&这是 int&& ,但这是参数的类型,而不是类型 T .

这与非转发引用完全一致。如果你定义:

template<typename T> void baz(T&);

然后你用 int 类型的左值调用它然后 T推导为 int , 不是 int&

像您的示例使用的转发引用的唯一特殊之处在于 T&&该类型可以推导为左值引用,称它为R , 在这种情况下参数类型是 R&&add_rvalue_reference_t<R> 相同这就是 R .所以调用电话bar(a)你叫专业bar<int&>(int&)T推导为 int&

当您调用 bar<int&&>(0) 时对于显式模板参数列表,没有参数推导,因此 Tint&& 取代, 所以参数类型 T&&add_rvalue_reference_t<int&&>这就是 int&& .

关于c++ - 使用通用引用时的类型推导,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40554575/

相关文章:

c++ - 无法针对 Fedora 中的 mongo C++ 驱动程序进行编译

c++ - boost 图形复制和删除顶点

c++ - 传递 std::function<bool(std::string)> &&callback(即作为右值 move )是否安全,效果如何?

c++ - 为什么右值不能分配给 constexpr 引用变量

c++ - std::async int 函数可以在任务完成之前退出吗?

c++ - 使用 std::move,调用 move 构造函数但对象仍然有效

c++ - 函数返回的 RVO 和右值如何工作?

c++ - ModelViewProjection 与 WorldViewProjection 相同吗?

c++ - 样本 SDL 程序给出一个空窗口

c++ - 使用 std::tuple_size 时产生 `error: incomplete type`