Rvalue参考参数和模板函数

时间:2011-04-03 20:57:29

标签: c++ c++11 rvalue-reference

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

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

我可以使用GCC 4.5与aararr调用它:

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

2 个答案:

答案 0 :(得分:12)

模板参数中的演绎行为是唯一的,这也是模板版本工作的原因。在另一个问题的背景下,我已经详细解释了这种演绎是如何运作的here

总结:当参数为左值时,T推断为T&T& &&折叠为T&。使用T&处的参数,为它提供左值T是完全有效的。否则,T仍为T,参数为T&&,接受rvalues参数。

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

答案 1 :(得分:7)

除了GMan的正确答案A Brief Introduction to Rvalue References之外,还有一个错误的例子,因为它是在语言变更之前编写的,这是非法的:

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

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

更新:哦,同一篇文章最初发布here,(imho)格式稍好一些。