8

以下は未定義動作かどうか疑問に思いました

// Case 1:
int *p = 0;
int const *q = *const_cast<int const* const*>(&p);

// Case 2: (I think this is the same)
int *p = 0;
int const *const *pp = &p;
int const *q = *pp;

int*これは、あたかもそれがであるかのように読み取ることによる未定義の動作int const*ですか?未定義の動作だと思いますが、以前constは一般的に追加するだけで安全だと思っていたので、よくわかりません。

4

1 に答える 1

5

資格に関しては、それは問題ありません。各式をステートメントに分割すると、次のようになります。

int *p = 0; // ok
int **addrp = &p; // ok
int const *const *caddrq = addrp; // ok, qualification conv. according to §4.4/4
int const *q = *caddrq; // ok

const_cast(§5.2.11/ 3)のルールは資格変換のルールと同じですが、資格が単調に増加する必要がないことに注意してください。あなたの場合、資格を追加するだけなので、それconst_castは不要です。


エイリアシングに関しては、ここでは問題ではないと思います。少なくとも、意図されたものではありません。

あなたが述べたように、許可されたアクセス方法のC ++ 0xリスト(§3.10)に、同様のタイプ(「類似」は資格変換から生じるタイプ)を許可する新しい箇条書きがあります。C ++ 03ではその箇条書きが欠落していますが、より多くのcv修飾アクセスを許可することに関する箇条書きはそれをカバーすることを意図していたと思いますが、技術的にはそうではありません(つまり、委員会はこれを見落としていました)。

于 2011-05-11T20:10:06.560 に答える