首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何理解引用的列表初始化中的prvalue

如何理解引用的列表初始化中的prvalue
EN

Stack Overflow用户
提问于 2020-03-20 02:47:06
回答 1查看 102关注 0票数 2

考虑以下代码:

代码语言:javascript
复制
#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初始化其结果对象”感到非常困惑。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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初始化的对象的类型,以及用于初始化它的机制。这句话解释了后半部分。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60767886

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档