2

C++ ドラフト標準 N3337セクション5.2.10Reinterpret cast7 (強調鉱山):

オブジェクト ポインターは、別の型へのオブジェクト ポインターに明示的に変換できます。「T1 へのポインター」型の prvalue v が「cv T2 へのポインター」型に変換されるとき、結果は、static_cast<cv T2*>(static_cast<cv void*>(v)) T1 と T2 の両方が標準レイアウト型 (3.9) であり、T2 のアライメント要件がそれらより厳密でない場合です。 T1 の、またはいずれかの型が void の場合。

これは、式vが prvalue であることを意味しますか? もしそうなら、

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

上記の変数paは ですので、 の変数が正しい式にある場合、その変数はの 型lvalueであると考えることができますか?.lvalueprvalue

4

2 に答える 2

2

cppreference はここであなたの友達です。値カテゴリのトピックに行くと、 prvalueは次のようになります。

prvalue (「純粋な」右辺値) は、その評価が次のいずれかである式です。

  • 演算子のオペランドの値を計算します (そのような prvalue には結果オブジェクトがありません)、または
  • オブジェクトまたはビットフィールドを初期化します (そのような prvalue は結果オブジェクトを持つと言われます)。すべてのクラスおよび配列の prvalues には、破棄された場合でも結果オブジェクトがあります。特定のコンテキストでは、結果オブジェクトとして一時オブジェクトを作成するために一時マテリアライゼーションが発生します。

これは自動的に啓発的ではありませんが、以下の非常に優れた例のセットを提供します。ポインターの例のいくつかを引用します。

次の式は 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 に答える