8

如果我定义一个接受右值引用参数的函数:

template <typename T>
void fooT(T &&x) {}

我可以使用 GCC 4.5 调用它,使用a,ararr:

int a, &ar = a, &&arr = 7;
fooT(a); fooT(ar); fooT(arr);

但是,调用类似的非模板函数,

void fooInt(int &&x) {}

使用这三个参数中的任何一个都将失败。我正准备加强我的知识forward,但这让我偏离了方向。也许是 GCC 4.5;我惊讶地发现A Brief Introduction to Rvalue References中的第一个示例也给出了编译错误:

A a;
A&& a_ref2 = a;  // an rvalue reference
4

2 回答 2

12

模板参数的推导行为是独一无二的,这也是您的模板版本起作用的原因。在另一个问题的背景下,我已经准确地解释了这个推论是如何工作的。

总结:当参数是左值时,T推导为T&,并T& &&折叠为T&。并且使用参数 at T&,为其提供左值是完全有效的T。否则,T仍然是T,并且参数是T&&,它接受右值参数。

相反,int&&总是int&&(没有模板推导规则将其强制为其他东西),并且只能绑定到右值。

于 2011-04-03T21:13:27.970 回答
7

除了 GMan 的正确答案A Brief Introduction to Rvalue References有一个不正确的例子,因为它是在语言更改之前编写的,该更改是非法的:

A a;
A&& a_ref2 = a;  // an rvalue reference (DISALLOWED in C++11)

尽管语言发生了这种变化,但文章中描述的主要用例(移动和前进)仍然在文章中正确解释。

更新:哦,同一篇文章最初发表在这里(恕我直言)格式稍好。

于 2011-04-03T21:18:50.357 回答