gpt4 book ai didi

c++ - 在重载决议方面,xvalue 和 prvalue 之间的行为差​​异的一个具体、简洁的例子是什么?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:45:01 27 4
gpt4 key购买 nike

几个星期以来,我一直在仔细研究右值和右值引用。我越来越有信心,我对以下两者之间的区别有了一定的了解:

  • 定义变量或函数参数的类型(即 int x;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 表达式成功调用。 (如果我对此有误解,请指正。)

我的问题是:由于 test 的函数参数 A&& a 成功绑定(bind)到 xvaluesprvalues,在重载决议方面,xvalues 和 prvalues 之间的实际区别是什么?

是否有表达式的 xvalue/prvalue 性质导致不同函数重载决议的场景示例?还是 xvalues 和 rvalues 之间的区别仅与语言的其他方面相关,与函数重载决策无关(例如,decltype 的结果(即,参见 What is decltype(0 + 0)? ))?

最佳答案

我认为重载决议不会有任何不同,不。

不过,还有很多其他原因可以阐明哪些表达式是 xvalues 和 prvalues。 Xvalues 是可修改的;右值不是。 Xvalues 受制于在对象生命周期之前或之后不正确使用 glvalues 的规则;这从来都不是纯右值的问题。

关于c++ - 在重载决议方面,xvalue 和 prvalue 之间的行为差​​异的一个具体、简洁的例子是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14000076/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com