据说,:任何在临时物化之后指定临时对象的表达式都是xvalue表达式(自C++17)。
任何完整类型T的prvalue都可以转换为相同类型的xvalue。这种转换通过用临时对象作为结果对象计算出临时值,从而从prvalue初始化T类型的临时对象,并生成一个表示临时对象的xvalue。
我怀疑我不明白的是,从这段引语中,临时物化转换(prvalue-> xvalue )产生了一个表示临时对象的xvalue。为了澄清我不完全理解的内容,我将提供一个简单的示例:
const T& t = T(); 引用t绑定到prvalue T()。因此,从这个prvalue创建并初始化一个类型为T的临时值;然后引用将绑定到该临时值。我认为临时的情况如下所示:t引用将绑定到它:
T __tmp{ };
const T& t = __tmp; 实际上,上述两行都是隐式发生的,但一般来说,我是否可以说赋值const T& t = __tmp;中的表达式const T& t = __tmp;是xvalue表达式?
到目前为止,我一直假设我是真的,如果不是,那么xvalue的意思是“在临时物化为xvalue表达式之后,任何指定临时对象的表达式”是什么意思?现在xvalue表达式到底在哪里?在这种情况下,"designates“这个词是什么意思?
发布于 2022-03-09 16:57:05
当编译器将const T& t = T();转换为AST时,大致如下所示:
`-DeclarationStatement
`-VariableDeclaration (name: t, type: const T&)
`-InitializerExpr (type: const T, category: glvalue)
`-MaterializeTemporaryExpr (type: const T, category: xvalue) [conv.rval]
`-ImplicitCastExpr (type: const T, category: prvalue) [dcl.init.ref#5.3]
`-ExplicitCastExpr (type: T, category: prvalue) [expr.type.conv]( ImplicitCastExpr来自于Dcl.init.ref#5.3句-2中的“调整到”一词)
所以回答
现在xvalue表达式到底在哪里?
它是语法树上的MaterializeTemporaryExpr。在C++中有许多这样的隐式转换(甚至在C中,例如考虑1.2/2的AST )。
我可以说赋值
__tmp中的表达式const T& t = __tmp;是xvalue表达式吗?
不,这是每个expr.prim.id的值,所以通过dcl.init.ref需要一个非常不同的路径。而且也没有任务
发布于 2022-03-09 14:50:03
我可以说赋值
const T& t = __tmp;中的表达式const T& t = __tmp;是xvalue表达式吗?
最好说,作为等效的代码是不正确的,因为它不包括xvalue转换步骤。更准确的版本是:
T __tmp{ };
const T& t = std::move(__tmp);std::move强制转换导致引用对象__tmp的xvalue表达式。
在这方面,“指定”一词是什么意思?
在其他情况下也是如此。它没有被用作一个特殊的术语。它只是“指定”一词:标记或指出;表示;显示;指定。表达式T()指示/显示/指定特定对象。
https://stackoverflow.com/questions/71397718
复制相似问题