4

Bjarne は、const が型の前または後に配置できる理由を説明しています。

http://www.stroustrup.com/bs_faq2.html#constplacement

"const T" and "T const" were - and are - (both) allowed and equivalent.
[...]

なんで?私が "const" (最初は "readonly" という名前で、対応する "writeonly" があった) を発明したとき、型の前または後に置くことができました。

私がすぐに思ったのは、「それは理にかなっていますが、それが理由なら、なぜ const が特別なのですか?」ということでした。どうやらそうではないようです。次の場合、clang と gcc はどちらも警告を発しません。

int volatile myint;
int static myotherint;

これが有効であることは理にかなっていますが、この構文が使用されたり、可能性として言及されたりしたことはありません。有効な C++ 型の後に static 修飾子と volatile 修飾子を配置していますか?

基準のテキストからこれをどのように判断しますか?

4

3 に答える 3

4

はい、その構文は問題ありません。宣言文法の最初の部分はdecl-specifiersのシーケンスです。これらには、ストレージ クラス指定、型指定子、関数指定、、、friendおよびtypedefが含まれconstexprます。文法では、それらを任意の順序で表示できます。ただし、それらに適用されるセマンティック ルールにより、いくつかの制限が導入されます。たとえば、変数宣言では、cv 修飾子 (constまたはvolatile) ではない型指定子が常に 1 つ必要です。また、複数のストレージ クラス指定子があってはなりません (またはthread_localと一緒に使用できる場合を除く)。staticextern

decl-specifiers のシーケンスは、ポインター、参照、配列などの複合型構文の前に来ることに注意してください。たとえば、decl-specifiers のシーケンスは、次の例でマークされています。

static const int *p;
|              |

char volatile static *(&p)[20];
|                  |

volatileは のような cv 修飾子であるため、指定した例constで許可する理由はの場合と同じであることに注意してください。これらのキーワードは、宣言内のより深い位置に表示されることもあります ( のように)。volatileconstint *volatile x;

慣例により、ストレージ クラスの指定を最初に記述し、その後に必要に応じてタイプの指定と cv 修飾子を記述します。私は cv-qualificationsを対応する型指定子のに書くことを好みます。より一貫性があるからです。

宣言と宣言子とは何か、およびそれらの型は標準によってどのように解釈されますか? を読みたいと思うかもしれません。.

于 2014-08-20T23:09:13.620 に答える
2

これらの部分は、実際には標準でかなり広く分離されています。static§7.1.1/1 で指定されているように、ストレージ クラスです。

storage-class-specifier:
    register
    static
    thread_local
    extern
    mutable

§1.7 で定義されているように、これはdecl-specifierで使用されます。

decl-specifier:
    storage-class-specifier
    type-specifier
    function-specifier
    friend
    typedef
    constexpr

decl-specifier-seq:
    decl-specifier attribute-specifier-seqopt
    decl-specifier decl-specifier-seq

したがって、これにより、static intまたはint staticタイプを指定できます。friend int f();同様に、フレンド関数をorとして宣言することもできますint friend f();

constまたはvolatile、実際に何かを宣言するときにのみ関与できるため、§ 8 の「宣言子」に分類されます。文法のこの部分は十分に長いため、すべてをフォーマットするのが面倒ですが、init-declarator-listを指定しますトップレベル、次にdeclarator、および (いくつかのレベルをスキップして)cv-qualifierどちらがconstorであるかに到達しvolatileます。少なくとも私の読みでは、基本的にconstorvolatileを型を指定する他のものと自由に混在させることができます。

于 2014-08-20T23:23:34.987 に答える