标准 N3337 5.2.10 第 7 条中的C++"类型"是什么意思?

What does this mean "prvalue of type“ in C++ standard N3337 5.2.10 clause 7?

本文关键字:C++ 类型 是什么 意思 N3337 标准      更新时间:2023-10-16

在C++草案标准N3337第5.2.10节Reinterpret cast第7条(强调我的):

对象指针

可以显式转换为指向其他类型的对象指针。当类型为"指向 T1 的指针"的prvalue v 转换为"指向 cv T2 的指针"类型时,如果 T1 和 T2 都是标准布局类型 (3.9) 并且对齐方式,则结果static_cast<cv T2*>(static_cast<cv void*>(v))T2 的要求并不比 T1 的要求更严格,或者如果任一类型无效。

这是否意味着表达式v是一个 prvalue?如果是这样,那么

int a = 0x1234;
int *pa = &a;
char *pc = reinterpret_cast<char *>(pa);

上面,变量pa是一个lvalue,那么我们是否可以认为如果lvalue的变量在正确的表达式中,则该变量是类型的prvalue

cpp偏好是你的朋友,如果我们转到主题值类别,它会告诉我们一个 prvalue是:

prvalue("纯"rvalue)是一个表达式,其计算结果

  • 计算运算符的操作数的值(此类 prvalue 没有结果对象),或
  • 初始化对象或位字段(此类 prvalue 称为具有结果对象)。所有类和数组 prvalues 都有一个结果对象,即使它被丢弃也是如此。在某些情况下,发生临时具体化以创建临时作为结果对象;

这不会自动启发,但它们在下面提供了一组非常好的示例,我将引用一些指针示例:

以下表达式是 prvalue 表达式:

  • &a,内置的表达式地址;
    ...
  • 这个指针;
    ....

因此,将this指针或 address-of 的结果转换为该类型指针的 const 将适合措辞(假设它还没有 const),例如:

{
int x = 0;
const int *p = reinterpret_cast<const int*>(&x);
}

规范使用v来表示表达式。它不一定是变量的名称。

在您的示例中,您提到的段落不直接适用,因为pa是一个左值。相反,首先应用左值到右值的转换,然后应用本段。