1

最近、gcc-trunk ソースに「ユーザー定義リテラル」が実装されました。教えてください、可変長文字テンプレートの「ユーザー定義リテラル」を定義できないことを正しく理解していますか?

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;

そして、これは許可されていません:

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

?

ポイントは何ですか?

上。 これはあいまいさのためですか?

ありがとう。

4

2 に答える 2

8

いいえ、それは本当に意味がありません。文字列リテラルは に 2 つの引数として渡されoperator""、そのうちの 1 つはサイズであるため、必要なものは次のとおりです。

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

標準見積もり時間 (2.14.8.5):

5 L がuser-defined-string-literal の場合、strをud-suffixを除いたリテラルとし、lenをstr内のコード単位の数(つまり、終端の null 文字を除いた長さ) とします。リテラル L は、次の形式の呼び出しとして扱われます。

operator "" X (str, len)

可変長テンプレート形式は、ユーザー定義の整数リテラル(2.14.8.3) およびユーザー定義の浮動リテラル(2.14.8.4) に対してのみ考慮されます。

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

于 2011-11-11T18:01:43.030 に答える
1

method_callは有効な識別子です。たとえばsome_call、 ormy_callです。そのような識別子が によって再定義されることを許可された場合、どれだけのコードが壊れるか想像してみてくださいoperator""

于 2011-11-11T18:30:29.270 に答える