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

jac*_*k X 2 c++ language-lawyer c++17

考虑以下代码:

\n
#include <iostream>\nstruct A {\n    A() = default;\n    A(int) {\n\n    }\n};\nint main() {\n    A const& rf = { 0 };\n}\n
Run Code Online (Sandbox Code Playgroud)\n

在这里引用标准中的引用:

\n
\n

否则,如果 T 是引用类型,则生成 T 引用的类型的纯右值(#1) 。纯右值通过copy -list-initialization 或 direct-list-initialization初始化其结果对象,具体取决于引用的初始化类型。然后使用纯右值直接初始化引用[\xe2\x80\x89注意:像往常一样,如果引用类型是对非常量类型的左值引用,则绑定将失败并且程序格式错误。\xe2\x80\x89\xe2\x80\x94\xe2\x80\x89尾注\xe2\x80\x89]

\n
\n

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

\n

具体描述纯右值,DoesA{0}表示纯右值(#1)吗?

\n

所以我的问题是:

\n

1.如何表示纯右值(#1)或实际prvalue是什么

\n

2.既然生成了T\'类型的纯右值(删除引用),为什么不使用纯右值直接初始化引用

\n

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

\n

Nic*_*las 5

纯右值实际是什么

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

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

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

为什么不使用纯右值直接初始化引用

右值“直接初始化”引用。您引用的规范是这样说的:“纯右值随后用于直接初始化引用。”

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

引用引用一个对象,因此必须通过给它一个对象来初始化。花括号初始化列表不是一个对象;而是一个对象。事实上,它甚至不是一个表达。它是用于初始化对象的语法构造。因此,您尝试用非对象的东西初始化对对象的引用。从所有权利来看,这应该是一个编译错误。

但是,对于您的代码的含义有一个明显的解释。即,使用花括号初始化列表来初始化对象,然后使用该对象来初始化引用。这就是 C++ 所做的。

我对“纯右值通过列表初始化再次初始化其结果对象”感到非常困惑

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