2009-06-07

ユーザー定義リテラルの問題に対するふたつの解決案

ユーザー定義リテラルの問題点

ひとつ、グローバル名前空間に定義できないこと。
ひとつ、識別子はかならずアンダースコアひとつから始まらなければならないこと。
ひとつ、リテラルオペレーターを使うローカルなスコープの中で、using declarationをしなければ、本来の意図通りの文法で使えないこと。

およそ物事を設計するにあたって重要なのは、「ユーザーはどうしようもないバカである」という前提に立つ事だ。単なるユーザーに専門知識を期待してはいけないのはもちろんのこと、ユーザーはマヌケなことでも、それが出来るならば、する可能性がある。

だから、グローバル名前空間にユーザー定義リテラルを書くプログラマもいるだろうし、識別子をアンダースコアで始めないプログラマもいるはずだ。現に、C++03において、名前の衝突を防ぐためと称して、グローバル名前空間で、識別子をアンダースコアひとつで始めたり、さらにはアンダースコアふたつで始めたりするプログラマがいる。たとえ規格は未定義としていたとしても、そういうマヌケはいる。そこでどうするか。

ユーザー定義リテラルを規格から取り除く

これは最も簡単な解決方法。最初からユーザー定義リテラルなど存在しなければ、そんなマヌケなコードなど書かれることはない。

ill-formedにする

グローバル名前空間でのユーザー定義リテラルの定義と、アンダースコアひとつから始めない識別子のユーザー定義リテラルを、明確にill-formedにして、コンパイルエラーにする。コンパイルが通らなければ、いかにアホなプログラマでも、間違ったコードを書くことはない。ユーザー定義リテラルに関しては、コンパイルエラーにしても、互換性の問題はない。問題は、コンパイラベンダーが規格を正しく実装することは思えないことだが。

私としては、ユーザー定義リテラルを規格から取り除くほうが簡単だと思うのだが。

No comments: