数周以来,我一直在仔细研究rvalue和rvalue引用。我越来越自信,可以清楚了解以下两者之间的区别:
int x;
与int && x = …;
A&& foo()
,并且给定一个仅由foo()
组成的表达式,表达式类别为“xvalue”)foo
的相同定义,当在包含表达式中使用该子表达式foo()
的类型为A
(不是A&&
))。 我的问题是关于xvalue表达式和prvalue表达式之间的区别(这些表达式类别均为rvalues)。
鉴于:
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
成功绑定(bind)到xvalues和prvalues,就重载解析而言,xvalues和prvalues之间的实际区别是什么?是否存在一个示例示例,其中表达式的xvalue/prvalue性质导致不同的函数重载分辨率?还是xvalue和rvalue的区别仅与语言的其他方面相关,而与函数重载分辨率无关(例如
decltype
的结果(例如,参见What is decltype(0 + 0)?))? 最佳答案
我不认为过载分辨率会有所不同,不。
但是,还有许多其他原因来说明什么表达式是xvalues和prvalues。 Xvalues是可修改的; pr值不是。 Xvalue遵守防止在对象生存期之前或之后不适本地使用glvalues的规则; prvalues从来都不是问题。
关于c++ - 关于x值和pr值之间在重载分辨率方面的行为差异的一个具体而简洁的示例是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14000076/