ユーザー定義リテラルの問題点
ひとつ、グローバル名前空間に定義できないこと。
ひとつ、識別子はかならずアンダースコアひとつから始まらなければならないこと。
ひとつ、リテラルオペレーターを使うローカルなスコープの中で、using declarationをしなければ、本来の意図通りの文法で使えないこと。
およそ物事を設計するにあたって重要なのは、「ユーザーはどうしようもないバカである」という前提に立つ事だ。単なるユーザーに専門知識を期待してはいけないのはもちろんのこと、ユーザーはマヌケなことでも、それが出来るならば、する可能性がある。
だから、グローバル名前空間にユーザー定義リテラルを書くプログラマもいるだろうし、識別子をアンダースコアで始めないプログラマもいるはずだ。現に、C++03において、名前の衝突を防ぐためと称して、グローバル名前空間で、識別子をアンダースコアひとつで始めたり、さらにはアンダースコアふたつで始めたりするプログラマがいる。たとえ規格は未定義としていたとしても、そういうマヌケはいる。そこでどうするか。
ユーザー定義リテラルを規格から取り除く
これは最も簡単な解決方法。最初からユーザー定義リテラルなど存在しなければ、そんなマヌケなコードなど書かれることはない。
ill-formedにする
グローバル名前空間でのユーザー定義リテラルの定義と、アンダースコアひとつから始めない識別子のユーザー定義リテラルを、明確にill-formedにして、コンパイルエラーにする。コンパイルが通らなければ、いかにアホなプログラマでも、間違ったコードを書くことはない。ユーザー定義リテラルに関しては、コンパイルエラーにしても、互換性の問題はない。問題は、コンパイラベンダーが規格を正しく実装することは思えないことだが。
私としては、ユーザー定義リテラルを規格から取り除くほうが簡単だと思うのだが。
No comments:
Post a Comment
You can use some HTML elements, such as <b>, <i>, <a>, also, some characters need to be entity referenced such as <, > and & Your comment may need to be confirmed by blog author. Your comment will be published under GFDL 1.3 or later license with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.