2010-07-20

attributeの書ける場所が間違っていた

この記事は間違っている。クラス宣言の先頭に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と識別子の間に書くのが自然だ。さてどうするか。

2 comments:

Anonymous said...

> 言語仕様的に考える人間にとっては、変数や関数の場合は、識別子の後に書くのが自然であるし、クラスは、class-keyと識別子の間に書くのが自然だ。

なぜ,このような書き方が自然なんですか?
「自然である」という言葉の意味がよくわからないです.

江添亮 said...

たとえば、noreturnは、関数宣言のdeclarator-idに指定するものと定義されています。
そういうわけで、
void f [[noreturn]] () ;
と書けるわけです。

一方、関数の宣言には、先頭にもattributeを書くことができ、それは「関数に属する」と定義されています。
つまり、
[[noreturn]] void f() ;
は、
void f [[noreturn]] () ;
と書くのと同等の意味になるのです。