質問

$ 5.2.11/7- [注:オブジェクトのタイプに応じて、const -qualifier68をキャストするconst_castから生じるポインター、lvalue、またはポインターへのポインター、またはポインターへのポインターによって操作されます。 五月 未定義の動作を生成します(7.1.5.1)。 ]

このセクション(C ++ 03)の文言は私にとって驚くべきことです。驚いているのは2つのことです。

a)まず、「5月」の使用。なぜ「5月」なのですか?標準の他の場所は、未定義の動作について非常に決定的です

b)なぜそれが元々constオブジェクトのconstnessをキャストするのは、すぐに「未定義の動作」ではないのです。 UBをトリガーするために書き込みが必要なのはなぜですか?

役に立ちましたか?

解決

a)まず、「5月」の使用。なぜ「5月」なのですか?標準の他の場所は、未定義の動作について非常に決定的です

言葉の使用を深く見てはいけません 五月 ここ。ポイントは、この場合にコンステンを追い払うことが未定義の動作を引き起こすことです。

C ++標準は、次のように「5月」または「可能性」を使用します。

1.3.12:未定義の動作 五月 また、この国際標準が行動の明示的な定義の説明を省略している場合にも期待されます。

私の強調。基本的に、標準は「5月」という言葉を使用します。許可されています".

b)なぜそれが元々constオブジェクトのconstnessをキャストするのは、すぐに「未定義の動作」ではないのです。 UBをトリガーするために書き込みが必要なのはなぜですか?

constオブジェクトを特定のプラットフォームで読み取り専用メモリに保存できる可能性があるため、書き込みはUBをトリガーします。

他のヒント

私の理解では、問題のオブジェクトが基本的にconstオブジェクトである場合にのみUBになるということです。

根本的にconstであるデータは、メモリの読み取り専用部分にロードされる可能性があり、それに書き込むことは機能しないという考えです。ただし、問題のオブジェクトが根本的に可変性がある場合、適切に機能することが保証されています。

元:

const int  x = 4;
const int *y = x;

*const_cast<int*>(x) = 3; // UB - the pointed-to object may 
                          // be in read-only memory or whatever.

int        a = 7;
const int *b = a;

*const_cast<int*>(b) = 6; // Not UB - the pointed-to object is 
                          // fundamentally mutable.

以下のコメントの場合、コードはコメントでひどいように見えるためです。

標準の§7.1。5.1/4で、与えられた例は次のとおりです。

int i = 2;
const int * cip; // pointer to const int
cip = &i;        // OK: cv-qualified access path to unqualified
...
int* ip;
ip = const_cast <int *>( cip ); // cast needed to convert const int* to int*
*ip = 4;                        // defined: *ip points to i, a non-const object

したがって、これは特に許可されています。

あなたの最初の質問のために、何かなら 五月 未定義の動作を生成しますが、それはそれほど未定義ではありません。

第2部では、相互運用性の理由であると思います。たとえば、cはc99の前にそうではありません(またはそうではありませんでした) const キーワードなので、constオブジェクトをc関数に渡す場合は、constnessをキャストする必要があります。したがって、C ++標準は、書き込みが行われない限り、これが許可されることを指定します。 C関数が読み取り専用である場合、Constnessは安全に排除できます。

C ++であっても、一貫性のないまたは不完全なconst補正もかなり一般的です。したがって、私たちは時折、constオブジェクトをその引数を変更しない関数に渡すためにconst-and-const-and-const-andをキャストしなければならない状況に出くわします。

私はそれがなぜだと思います const オブジェクトは、読み取り専用メモリに保存できます。したがって、プログラムのクラッシュ、セグメンテーション障害、または効果がないというさまざまな効果が多く、さまざまな効果があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top