2011-11-11 11 views
1

最近、gcc-trunkソースでは、 "ユーザ定義リテラル"が実装されました。 私に教えてください、私は正しく `私は`ユーザー定義リテラルを定義することはできませんvariadicのcharテンプレートを理解していますか?Variadic charテンプレートのユーザ定義リテラル

template<char... chars> 
int operator"" _call() { return sizeof...(chars); } 
... 
std::cout << "method"_call; 

アップ。

template<char... chars> 
int operator"" _call() { return sizeof...(chars); } 
... 
std::cout << 12345566_call; 

と、この1が禁止されています:

template<char... chars> 
int operator"" _call() { return sizeof...(chars); } 
... 
std::cout << method_call; 

?この表現が許可されている理由を私は理解し `tを

何がポイントですか?

アップ。 これはあいまいさのためですか?

ありがとうございました。

答えて

1

method_callは、有効な識別子です(例:some_callまたはmy_call)。そのような識別子がoperator""によって再定義されることが許された場合、どのくらいのコードが壊れるか想像してみましょう。

8

いいえ、実際には意味がありません。文字列リテラルはoperator""に二つの引数として渡され、そのうちの一つがサイズですされているので、あなたが望むものである:

size_t operator"" _call(const char*, size_t len) { 
    return len; 
} 

標準引用時間(2.14.8.5)は:

5はLである場合はユーザドFiが定義さ、文字列リテラルSTRUD-サフィックスなしリテラルであることとlenのSTR(すなわち、その長さのコード単位の数としてみましょう終了ヌル文字を除く)。リテラルLは可変長テンプレートフォームのみのために考慮される

operator "" X (str, len) 

形のコールとして扱われ、リテラル整数定義さ(2.14.8.3)とユーザドFiあり定義さ-浮動ユーザドFiのリテラル(2.14.8.4)。

method_callについては、methodはリテラルではありません。

+0

私はこの変種について知っています。しかし、私はvariadic charテンプレートを期待していました。 – niXman

+1

@niXman:これは「異形」ではありません。それが標準によって定義される方法です。ユーザ定義の整数リテラルと浮動小数点リテラルだけが 'template 'フォームを使用することができます(したがって、 '12_call'があなたの最初のスニペットで動作します)。 –

関連する問題