问题标签 [xvalue]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 将 xvalue 呈现为左值的有效性
以下功能(在我的意图中)是获取一个右值并将其作为左值呈现。
我想在我可以保证没有真正从 xvalue 移动的情况下使用它(例如,它是通过 rvalue 转换为 rvalue 的std::move
,但没有利用它),所以我会用 xvalues 来调用它,而不是 prvalues。
无论如何,编译器(嗯,GCC 的版本)似乎对上述代码的有效性有不同的看法。具体来说,鉴于这种用法:
GCC 11.2 认为它无效:
而 GCC 10.3 和其他编译器认为它是有效的。
此外,将 return 语句从
至
使他们都同意代码是正确的。
从标准的角度来看,真相在哪里?
c++ - 指定临时对象的表达式如何是 xvalue 表达式?
从cppreference,我试图理解产生 xvalues 的表达式,我最终得到了这个摘要:
以下表达式是 xvalue 表达式:
- ...
- 在临时物化之后指定临时对象的任何表达式。
临时实现是:
任何完整类型 T 的纯右值都可以转换为相同类型 T 的 xvalue。这种转换通过使用临时对象作为其结果对象评估纯右值,从纯右值初始化类型 T 的临时对象,并产生一个表示临时对象。
根据我对上述引用的理解,临时实现涉及将纯右值转换为 xvalue 以初始化创建的临时值;这意味着无论何时实现纯右值,都会出现一个 xvalue 表达式。所以我发现自己必须了解prvalue何时具体化。然后我从cppreference检查了这个:
临时实现发生在以下情况:
- 1-绑定对prvalue的引用时;
- 2-当对类纯右值执行成员访问时;
- 3- 对数组纯右值执行数组到指针的转换或下标时;
- 4- 从花括号初始化列表初始化 std::initializer_list 类型的对象时;
- 5- 当 typeid 应用于prvalue时
- 6- 当 sizeof 应用于prvalue时
- 7- 当纯右值作为废弃值表达式出现时。
请注意,从相同类型的纯右值(通过直接初始化或复制初始化)初始化对象时不会发生临时实现:此类对象直接从初始化程序初始化。这确保了“保证复制省略”。
任何人都可以通过简单的例子帮助我在情况 3、4 和 7 中如何涉及 xvalue 表达式。