如何理解引用列表初始化中的纯右值

How to understand the prvalue within list-initialization of a reference

考虑以下代码:

#include <iostream>
struct A {
    A() = default;
    A(int) {

    }
};
int main() {
    A const& rf = { 0 };
}

在此处引用标准中的引述:

Otherwise, if T is a reference type, a prvalue(#1) of the type referenced by T is generated. The prvalue initializes its result object by copy-list-initialization or direct-list-initialization, depending on the kind of initialization for the reference. The prvalue is then used to direct-initialize the reference. [ Note: As usual, the binding will fail and the program is ill-formed if the reference type is an lvalue reference to a non-const type.  — end note ]

我不明白#1处的“prvalue”,如何表示这个prvalue?继续,为什么再次使用纯右值通过 list-initialization 初始化其 reuslt 对象,为什么不使用 reuslt 对象直接初始化引用而不是使用纯右值?

具体描述纯右值,A{0}是否表示纯右值(在#1)?

所以我的问题是:

1.How 表示纯右值(在#1)或 prvalue 是什么

2.Since已经生成了一个T'类型的纯右值(移除引用),为什么不使用纯右值直接初始化引用

3.I 再次列表初始化对“纯右值初始化其结果对象”感到非常困惑

what actullay the prvalue is

纯右值是一种表达式。在 C++17 及以后的版本中,它专门是一种初始化对象的表达式。所以纯右值只是一种初始化对象的机制。因此,纯右值的唯一特征是纯右值的类型(即:它将初始化的对象的类型)和它将用于初始化该对象的机制。

纯右值的使用方式决定了它初始化哪个对象。

那么,这个例子中的纯右值是多少?它是一个初始化器,对 T 引用的某些类型的对象使用列表初始化的形式。这就是关于纯右值的全部信息。

why not use the prvalue direct-initialize the reference

纯右值"direct-initialize"参考。您引用的规范是这样说的:"The prvalue is then used to direct-initialize the reference."

如果您要问的是为什么花括号初始化列表(又名:{...})和引用之间有一个纯右值,那是因为在某种程度上,您编写的代码使得没意义。

引用引用一个对象,因此必须通过给它一个对象来初始化。 braced-init-list 不是对象;事实上,它甚至不是 表达式 。它是用于初始化对象的语法结构。所以你试图用不是对象的东西来初始化对对象的引用。无论如何,这应该是一个编译错误。

但是,对于您的代码 的意思 有一个明显的解释。即,使用braced-init-list 初始化一个对象,然后使用该对象初始化引用。这就是 C++ 所做的。

I very confused about "The prvalue initializes its result object" by list-initialization again

如前所述,纯右值由两部分组成:要由纯右值初始化的对象的类型,以及用于初始化它的机制。这句话解释了后面的部分。