如何理解引用列表初始化中的纯右值
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
如前所述,纯右值由两部分组成:要由纯右值初始化的对象的类型,以及用于初始化它的机制。这句话解释了后面的部分。
考虑以下代码:
#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
如前所述,纯右值由两部分组成:要由纯右值初始化的对象的类型,以及用于初始化它的机制。这句话解释了后面的部分。