7

const以前に配列の宣言で2回使用されているのを見たことがstaticありますが、独自の静的配列を作成しているので、状況によっては const が2回必要になるのはなぜだろうかと思っています。

ポインタの配列を持つことは違いがありますか?

a. static const TYPE name[5];
b. static const TYPE const name[5];

c. static const TYPE* name[5];
d. static const TYPE* const name[5];

私の理解ではそれb.は無効ですが、 const を2回使用することが有効な場合、その目的は何ですか?

4

4 に答える 4

16
const TYPE* x;

x が指すものが const であることを意味します。

TYPE* const x;

ポインター x が const であることを意味します。

あなたが得る2つを組み合わせる:

const TYPE* const x;

つまり、ポインターと指されているものは両方とも const です。

于 2012-08-23T22:07:17.450 に答える
1

任意の cv 修飾子 (constまたはvolatile) を、cv 修飾された型を含む任意の型に適用できますが、同じ宣言内では適用できません。ただし、優先順位の点でどの演算子よりも強くバインドし、修飾された型の両側に適用できます。

// Let T by any type:
T const tr;
const T tl;
const T const tlr; // only in C
const const const const const T t5; // only in C
typedef const T CT;
CT const tcc; // fine, although CT was already const

まったく同じ定数を宣言しTます。既に cv-qualifiers がある場合T、これは追加の修飾の意味を変更しません。

さて、先に。「定数へのポインターが必要です」と言うことができますT

const T (* tp);

これは通常次のように書かれています

const T* tp;

とにかくconstバインドがより強いからです。*同じパターンで、「定数であるがミュータブルを指す」変数を定義できますT

T (* const tp) = 0; // must be initialised, because tp is immutable

これは一般的に次のように書かれています

T* const tp = 0;

同様に、添字演算子[]が適用されます -- 式と同じ優先順位で。

于 2012-08-23T22:25:05.180 に答える
0

最初のコード ブロックでは、2 行目に冗長な重複がありますがconst、これは効果がありません。(実際、優れたコンパイラはこれについて警告します。) 5const TYPEの配列を宣言しているだけです。

2 番目のコードブロックには 2 つの異なるシナリオがありconst TYPEます。const TYPE

定数の配列を初期化する必要があることに注意してください。後で値を変更することはできないため、それらを初期化せずに定義しても意味がありません。

于 2012-08-23T22:10:22.373 に答える
0

型での 2 回の使用constは、C++ 2003 では違法ですが、C++ 2011 では合法です (7.1.6.1 [decl.type.cv] 段落 1:「冗長な cv-qualifications は無視されます。」を参照してください)。使用したとき

static const TYPE const name[5];

あなたはTYPE定数を2回作りました。ただし、宣言const時にオブジェクトを初期化する必要があるため、この宣言は C++ 2011 でも違法であることに注意してください。の意味

const TYPE

TYPE const

は完全に同等です。どちらの場合も、TYPEオブジェクトを定数にします。一貫性を保つconstために、トップレベルの型を除くすべての型を右側に配置する必要があるため、常にconst右側に配置します (コーディング ガイドラインで別の方法が義務付けられている場合を除きますが、私はばかげたコーディング ガイドラインと戦っています)。

ポインターを使用すると、考え方が異なります。関連する 2 つの型があります: 型を指す型とポインターです。これらはそれぞれconst個別に作成できます。

TYPE const*       ptr1(0);  // non-const pointer to const TYPE
TYPE* const       ptr2(0);  // const pointer to non-const TYPE
TYPE const* const ptr3(0);  // const pointer to const TYPE

何が作成されているかを理解する最善の方法はconst、型宣言を右から左に読むことです。もちろん、これはconst修飾子が正しい場所に配置されていることを前提としています。const上記の議論でvolatileまたはで置き換えることができconst volatile、同じ理由が適用されます。

于 2012-08-23T22:25:07.530 に答える