3

考虑下面的代码。那里发生了什么?

#include <iostream>
#include <stdio.h>

using namespace std;

template<class T>
void test(T &t)  // but why  int&& is valid here,when  instantiated with test<int&>??
{
  puts("T&");
}

int tref(int&& param)    //compile  error
{
  puts("tref&");
}

int main()
{
  int i;
  test<int&>(i);
}
4

1 回答 1

7

我不确定我是否遵循,如果你的意思是int&&第一个,因为你错了。什么时候,签名中的那个还在。此外,与使用额外的. 具有特定含义:rvalue-referenceTint&Tint&T&int&int&&int&&&&

§8.3.2[dcl.ref]/5

不应有对引用的引用,没有引用数组,也没有指向引用的指针。[...]

§8.3.2[dcl.ref]/6

如果 typedef (7.1.3)、类型模板参数 (14.3.1) 或 decltype-specifier (7.1.6.2) 表示类型 TR 是对类型 T 的引用,则尝试创建类型“ lvalue reference to cv TR”创建类型“lvalue reference to T”,而尝试创建类型“rvalue reference to cv TR”创建类型TR。

于 2012-08-17T02:39:05.100 回答