2

C++ 标准草案 N33375.2.10节Reinterpret cast第 7节(强调我的)中:

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

这是否意味着表达式v是纯右值?如果是这样,那么

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

上面,变量pa是 an lvalue,那么我们可以认为如果变量 oflvalue在正确的表达式中,变量是 aprvalue类型的吗?

4

2 回答 2

2

cppreference 在这里是你的朋友,如果我们转到主题值类别它告诉我们一个prvalue是:

prvalue(“纯”右值)是一个表达式,其求值要么

  • 计算运算符的操作数的值(这样的纯右值没有结果对象),或
  • 初始化一个对象或一个位域(这样的纯右值被称为有一个结果对象)。所有类和数组纯右值都有一个结果对象,即使它被丢弃。在某些情况下,发生临时物化以创建临时对象作为结果对象;

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

以下表达式是纯右值表达式:

...

  • &a,内置地址表达式;
    ...
  • this 指针;
    ……

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

{
  int x = 0;
  const int *p = reinterpret_cast<const int*>(&x);
}
于 2018-10-28T15:48:20.950 回答
1

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

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

于 2018-10-28T18:55:55.187 回答