考虑以下代码:
#include <iostream>
struct A {
A() = default;
A(int) {
}
};
int main() {
A const& rf = { 0 };
}在这里引用标准的引文:
否则,如果T是引用类型,则生成由T引用的类型的
prvalue(#1)。prvalue根据引用的初始化类型,通过复制列表初始化或直接列表初始化初始化其结果对象。然后使用prvalue直接初始化引用。 注意:与往常一样,如果引用类型是对非const类型的lvalue引用,则绑定将失败,并且程序的格式不正确。 - 尾注
我不明白#1的"prvalue“,如何表示这个prvalue?并继续,为什么不使用prvalue再次使用list-initialization初始化它的reuslt对象,为什么不使用reuslt对象来直接初始化引用而不是使用prvalue?
要具体描述prvalue,A{0}是否表示prvalue(在#1)?
所以我的问题是:
1.如何表示prvalue (在#1处)或prvalue是什么
2.既然生成了T‘类型的prvalue (删除引用),为什么不直接使用prvalue -初始化引用?
3.我对list-initialization的“prvalue初始化其结果对象”感到非常困惑。
发布于 2020-03-20 04:08:29
什么是实际值?
prvalue是一种表达方式。在C++17和更高版本中,它特别是一种初始化对象的表达式。因此,prvalue只是初始化对象的一种机制。因此,prvalue的唯一特征是prvalue的类型(即它将初始化的对象的类型)以及它将用于初始化该对象的机制。
如何使用prvalue决定由它初始化哪个对象。
那么,这个实例中的prvalue是什么呢?它是一个初始化器,它对T引用的某个类型的对象使用一种列表初始化形式。这就是关于prvalue的所有需要了解的内容。
为什么不直接使用prvalue -初始化引用?
prvalue会“直接初始化”引用。您引用的规范是这样说的:“然后使用prvalue来直接初始化引用。”
如果您要问的是为什么在大括号内列表(又名:{...})和引用之间有一个prvalue,那是因为,在某种程度上,您编写的代码是没有意义的。
引用是指一个对象,因此必须通过给它一个对象来初始化。大括号中的列表不是一个对象;实际上,它甚至不是一个表达式。它是一种语法结构,用于初始化一个对象。因此,您尝试用非对象的内容初始化对对象的引用。当然,这应该是一个编译错误。
但是,对于您的代码意味着什么,有一个显而易见的解释。也就是说,使用大括号-init-列表初始化一个对象,然后使用该对象初始化引用。这就是C++所做的。
我对列表初始化“prvalue初始化其结果对象”非常困惑。
如前所述,prvalue由两件事组成:由prvalue初始化的对象的类型,以及用于初始化它的机制。这句话解释了后半部分。
https://stackoverflow.com/questions/60767886
复制相似问题