2010-08-29

バイク小屋議論

Rapperswill会議で、すでに決定されたことがある。attribute-tokenのうち、final、override、hiding、base_checkを、本物のキーワードを使う文法に置き換えようというものである。

たとえば、以下のように書くべきだったコードを

struct Base
{
    virtual void f() { }
    int value ;
} ;

struct [[ final, base_check ]] Derived
{
    [[ override ]] virtual void f() { }
    [[ hiding ]] int value ;
} ;

キーワードを使った文法にする。例えばの話だが、以下のようになるかもしれない。

struct Base
{
    virtual void f() { }
    int value ;
} ;

struct final_overrider verify_decls Derived
{
    virtual void f virtual_override () { }
    int value hiding_name ;
} ;

見ての通り、非常に汚いキーワードである。しかし、これは真面目に提案されたキーワードである。本物のキーワードを導入するということは、その名前を使っている既存のコードをすべてぶち壊すということである。したがって、絶対にかぶらないであろう名前しか使うことはできない。その結果、このようなキーワードになる。また、文法も、specifierのように宣言の前に書けるようにするか、identifierの後ろに書くようにするかで揉めている。前置するとなると、以下のようになる。

struct Base
{
    virtual void f() { }
    int value ;
} ;

final_overrider verify_decls struct Derived
{
    virtual_override virtual void f() { }
    hiding_name int value ;
} ;

少しはマシだろうか。とはいえ、キーワードの醜さは変わりない。

これを見て、どう思うであろうか。attributeとキーワードと、どちらを好むであろうか。教えて欲しい。因みに私は、こんな汚いキーワードを使うぐらいなら、attributeの方がマシだと考えている。

こうなった理由は、attributeというのは、あくまで独自拡張用の機能であり、標準規格が積極的に使うべきではないという考えからのようだ。しかし、それをいえば、各ベンダーだって、キーワードを使ったもっと分かりやすい文法の方がいいと考えはしないだろうか。その結果、MSVCの__declspecや、gccの__attribute__がでてきたのだから。そんな考えでは、attributeはasm宣言と同じく、実装から無視されるのではあるまいか。

ちなみに、このタイトルである「バイク小屋議論」というのは、この問題を議論していた標準化委員会のMLのタイトルが、"Bikeshedding, yay! (keywords for override control attributes)"だったからである。

No comments: