如果我定义一个接受右值参考参数的函数:
template <typename T>
void fooT(T &&x) {}
我可以使用GCC 4.5与a
,ar
或arr
调用它:
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
答案 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)格式稍好一些。