【发布时间】:2012-12-09 14:53:15
【问题描述】:
数周以来,我一直在仔细研究右值和右值引用。我越来越有信心清楚地理解以下两者之间的区别:
- 变量或函数参数的类型定义(即
int x;vs.int && x = …; - 表达式的表达式类别,包括那些可能使用先前定义的参数的表达式(即,给定函数定义
A&& foo(),并且给定一个仅由foo()组成的表达式,表达式类别是“xvalue”) - 当子表达式在包含表达式中使用时,子表达式求值结果的类型(即,给定
foo的相同定义,类型在包含表达式中使用时,子表达式foo()是A(不是A&&))。
我的问题是关于 xvalue 表达式和 prvalue 表达式之间的区别(这两个表达式类别都是右值)。
给定:
class A
{};
A&& foo() {…}
A goo() {…}
void test(A&& a) {…}
int main()
{
test(foo()); // test() called with xvalue expression
test(goo()); // test() called with prvalue expression
}
请注意,函数test() 成功调用了一个 xvalue 表达式和一个 prvalue 表达式。 (如果我对此有误解,请纠正我。)
我的问题是:由于函数参数A&& a 到test 成功绑定到 xvalues 和 prvalues,xvalues 和 prvalues 之间的实际区别是什么在重载分辨率方面?
是否存在表达式的 xvalue/prvalue 特性导致不同的函数重载分辨率的场景示例?还是 xvalues 和 rvalues 之间的区别仅与语言的其他方面相关,与函数重载决议无关(例如,decltype 的结果(即参见What is decltype(0 + 0)?))?
【问题讨论】: