1. ホーム
  2. c++

[解決済み] Const before or const after?

2022-04-23 20:23:13

質問

まず始めに、皆さんは以下のことをご存知でしょう。 const は、オブジェクトのデータかポインタのどちらか、または両方を変更できないようにするために使用できます。

const Object* obj; // can't change data
Object* const obj; // can't change pointer
const Object* const obj; // can't change data or pointer

しかし、この構文も使うことができます。

Object const *obj; // same as const Object* obj;

問題は、アスタリスクのどちら側に const というキーワードがあります。 個人的には const その方が左から右への思考で読みやすいと思うからです。

さらに重要なことは、なぜ2つの正しい指定方法があるのかということです。 const また、どのような場合にどちらを選ぶか、あるいは必要とするか教えてください。

編集する

つまり、私が生まれるずっと前に、コンパイラがどのように物事を解釈すべきかという標準が起草されていたのに、これは恣意的に決定されたように聞こえるのです。 ということは const は、キーワードの左側にあるものに適用される(デフォルトで? "ショートカット" をパースして宣言が変わるまでは、少なくともキーワードや型式修飾子を他の方法で適用することができます.

これは、C言語でも同様だったと思うのですが?

解決方法は?

<ブロッククオート

の指定に2つの正しい方法があるのはなぜですか? const また、どのような場合にどちらを選ぶか、あるいは必要とするか教えてください。

本来なら、その位置が const アスタリスクより前の指定子内は重要ではなく、C言語の文法はKernighanとRitchieによってそのように定義されたからです。

このように文法を定義した理由は、Cコンパイラが入力を左から右へ解析し、それを消費することで各トークンの処理を終了させるためと思われる。 そのため * トークンは、現在の宣言の状態をポインタ型に変更します。 エンカウンター const の後に * というのは const 修飾子はポインタの宣言に適用されます。 * は、指されたデータに対して適用されることを意味します。

を指定しても、意味的には変わらないので。 const 修飾子が型指定子の前でも後でも、どちらでも受け入れられます。

同じようなケースは、関数ポインタを宣言するときにも起こります。

  • void * function1(void) を返す関数を宣言しています。 void * ,

  • void (* function2)(void) を宣言しています。 関数ポインタ を返す関数に void .

ここでも注目すべきは、この言語の構文が左から右へのパーサーをサポートしていることです。