この記事は間違っている。クラス宣言の先頭にattribute-specifierを指定しても、クラス定義には属さない。なぜならば、クラス定義は、class-specifierであるので、class C {} c ;のような記述ができる。したがって、クラスの場合は、class-keyとidentifierの間に書かなければならない。
以下、過去に書いた間違っている文章。
クラスの場合、以下の二行は、同じ意味である。
class [[ final ]] name ; [[ final ]] class name ;
よく考えたら、class-specifierも、type-specifierに含まれるので、それはつまり、クラスの宣言と定義は、simple-declarationであるという単純なことを忘れていた。
さて、attributeを教える際には、attributeを指定する場所を、どのように教えるべきだろうか。初心者には、先頭に書く方が、分かりやすいと思う。しかし、私のように言語仕様的に考える人間にとっては、、変数や関数の場合は、識別子の後に書くのが自然であるし、クラスは、class-keyと識別子の間に書くのが自然だ。さてどうするか。
> 言語仕様的に考える人間にとっては、変数や関数の場合は、識別子の後に書くのが自然であるし、クラスは、class-keyと識別子の間に書くのが自然だ。
ReplyDeleteなぜ,このような書き方が自然なんですか?
「自然である」という言葉の意味がよくわからないです.
たとえば、noreturnは、関数宣言のdeclarator-idに指定するものと定義されています。
ReplyDeleteそういうわけで、
void f [[noreturn]] () ;
と書けるわけです。
一方、関数の宣言には、先頭にもattributeを書くことができ、それは「関数に属する」と定義されています。
つまり、
[[noreturn]] void f() ;
は、
void f [[noreturn]] () ;
と書くのと同等の意味になるのです。