考虑以下代码:
#include <iostream>
struct A {
A() = default;
A(int) {
}
};
int main() {
A const& rf = { 0 };
}
在此处引用标准引用:我不了解
#1
的“prvalue”,如何表示此prvalue?并继续,为什么再次使用prvalue通过list-initialization
初始化其reuslt对象,为什么不使用reuslt对象直接使用prvalue直接初始化引用呢?为了具体描述prvalue,
A{0}
是否表示prvalue(在#1)?所以我的问题是:
1.如何表示prvalue(在#1)或
prvalue
是什么actullay2.由于已生成类型为T'(删除引用)的prvalue,为什么不使用prvalue直接初始化引用
3.我对列表初始化再次对“prvalue初始化其结果对象”感到非常困惑
最佳答案
prvalue是一种表达。在C++ 17及更高版本中,它特别是一种初始化对象的表达式。因此,prvalue只是用于初始化对象的机制。这样,prvalue的唯一特征是prvalue的类型(即:它将初始化的对象的类型)以及它将用于初始化该对象的机制。
prvalue的使用方式决定了哪个对象被它初始化。
那么,这种情况下的prvalue是多少?这是一个初始化程序,它对T
所引用类型的某些对象使用列表初始化的形式。这就是有关prvalue的全部知识。
prvalue会“直接初始化”引用。您引用的规范是这样说的:“然后将prvalue用于直接初始化引用。”
如果您要问的是为什么braced-init-list(aka:{...}
)和引用之间存在prvalue,这是因为在某种程度上,您编写的代码没有意义。
引用引用一个对象,因此必须通过给它一个对象来对其进行初始化。括号初始列表不是对象。实际上,它甚至不是表达。它是用于初始化对象的语法构造。因此,您尝试使用不是对象的对象初始化对对象的引用。保留所有权利,这应该是编译错误。
但是,对于您的代码打算做什么有一个明显的解释。即,使用braced-init-list初始化一个对象,然后使用该对象初始化引用。这就是C++的功能。
如前所述,prvalue由两部分组成:要由prvalue初始化的对象的类型,以及用于初始化它的机制。这句话解释了后面的部分。
关于c++ - 如何在引用的列表初始化中了解prvalue,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60767886/