考虑以下代码:

#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是什么actullay
2.由于已生成类型为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/

10-11 04:08