リテラルオペレーターは、必ず名前空間の中で定義しなければならない。さらに、使う場合は、using declarationするのが一般となるだろう。なぜなら、誰も以下のように書きたくはないからだ。
namespace foo { int operator "" _bar (char *) ; } void f() { auto x = foo::operator "" _bar("hello,world!") ; }
もはや、ユーザー定義リテラルである必然性がない。普通の関数でいい。そこで、以下のようにする。
void f() { using foo::operator "" _bar ; auto x = "hello,world!"_bar ; }
実際には、複数のリテラルオペレーターを使いたいだろうし、ライブラリ側で、一度にすべてのusing declarationをしてくれる、プリプロセッサのマクロを提供するのが一般的となるだろう。しかし、そこまでして使いたいだろうか。ユーザー定義リテラルの本来の面目は、わかりやすいシンタックスシュガーとなることではなかったのか。関数ではなく、リテラルとして自前のクラスの値が記述できれば、分かりやすいコードになるというものではなかったのか。それが、ユーザー定義リテラルを使うには、そのまさに使わんとするローカルスコープ内で、おまじないのようなusing declarationが必要とあっては、一体誰が能く使うというのだろう。
偉い人の考えることは分からない。
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.