20

C++ (C++11) 標準のさまざまな場所で、宣言はdefined-declarator-type-list の観点から記述されています。私は右辺値参照を研究しており、この用語の使用はそのコンテキストで重要です (§8.3.2):

Dが     & attribute-specifier-seq opt D1     && attribute-specifier-seq opt D1のいずれかの形式を持つ宣言TDで、宣言T D1の識別子の型は "<em>derived-declarator-type-list T 」の場合、 Dの識別子の型は「<em> T への派生宣言子型リスト参照」です。</p>


残念ながら、カテゴリ「派生宣言子型」は標準で定義されていません。(「派生」という言葉の使用をすべて調べました。さらに、これはおそらくここここで確認されています。)

generated-declarator-type-list」はイタリック体で表示されているため、これはカテゴリを参照しており、次のような変数ラベルを参照していないと想定しますT(したがって、「 「派生宣言子型リストX」の代わりに使用しています)。

C++11 標準の派生宣言子型の定義は何ですか?

4

1 に答える 1

16

それはその場で定義されています。T次のように、前に出てきたものを次のタイプに運ぶ方法です。

<some stuff> T
<some stuff> reference to T

Tの型の前に来るものは何でもですT D1

たとえば、int& (*const * p)[30]Tis intDis & (*const * p)[30]、およびD1isという宣言があるとします(*const * p)[30]。の型T D1は「constへのポインタ 30 intの配列へのポインタ」です。したがって、引用したルールによれば、のタイプpは「intへの30参照の配列へのポインタへのポインタ」です。

もちろん、この宣言は §3.4.2/5 によって許可されません。

参照への参照、参照の配列、および参照へのポインタがあってはなりません。

派生宣言子型リストであるという非公式の用語は、C 標準の派生型の定義に由来すると思います(C++ の複合型に似ています)。

次のように、オブジェクト、関数、および不完全な型から任意の数の派生型を構築できます。

  • 配列[...]
  • 構造タイプ[...]
  • ユニオンタイプ[...]
  • 関数タイプ[...]
  • ポインタ[...]

コメントへの回答: 型と宣言子の間で混乱しているようです。たとえば、int* pが宣言子の場合、 の型pは「int へのポインタ」です。タイプは、これらの英語のような文として表されます。

例 1 :int *(&p)[30]

これは宣言ですT D(§8.3.1 ポインタ):

  • T->int
  • D->*(&p)[3]

D形式は次のとおりです。

* attribute-specifier-seq opt cv-qualifier-seq opt D1

はどこD1ですか(&p)[3]。つまりT D1、 「 int (&p)[3]3 の配列への参照」型を持つ形式intです (これを再帰的に処理し、次のステップで §8.3.4 配列などを使用します)。の前にあるものはすべてint派生宣言子型リストです。pしたがって、元の宣言では、「への 3 つのポインターの配列への参照」という型があると推測できますint。魔法!

例 2 :float (*(*(&e)[10])())[5]

これは宣言ですT D(§8.3.4 配列):

  • T->float
  • D->(*(*(&e)[10])())[5]

D次の形式です。

D1 [ 定数式opt ] 属性指定子 seq opt

はどこD1ですか(*(*(&e)[10])())。この手段T D1は、float (*(*(&e)[10])())「float へのポインターを返す () の関数への 10 ポインターの配列への参照」という型を持つ形式です (これは、§8.3/6 を適用してから、§8.3.1 ポインターなどを適用して解決します)。の前にあるものはすべてfloat派生宣言子型リストです。pしたがって、元の宣言では、「5 float の配列へのポインターを返す () の関数への 10 ポインターの配列への参照」という型があると推測できます。マジック再び!

于 2012-12-08T16:22:45.327 に答える