用户定义的可变字符模板文字

发布于 2024-12-15 14:02:48 字数 658 浏览 1 评论 0原文

最近,在 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;

有什么意义?

向上。 这是因为歧义吗?

谢谢。

Recently, in the gcc-trunk sources was implemented the "user defined literals".
Tell me please, do I understand correctly that I can`t define a "user defined literals" for variadic char template?

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

Up.

I don`t understand why this expression is allowed:

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

and this one is disallowed:

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

?

What's the point?

Up.
this is because of the ambiguity?

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

ゞ记忆︶ㄣ 2024-12-22 14:02:48

不,这确实没有意义。字符串文字作为两个参数传递给 operator"",其中之一是大小,所以您想要的是:

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

标准报价时间 (2.14.8.5):

5 如果 L 是用户定义的字符串文字,则令 str 为不带 ud 后缀的文字,并令 < em>len 是 str 中代码单元的数量(即,其长度不包括终止空字符)。文字 L 被视为以下形式的调用

运算符 "" X (str, len)

可变参数模板形式仅考虑用于用户定义的整数文字(2.14.8.3)和用户定义的浮动文字< /em> (2.14.8.4)。

至于method_callmethod不是文字。

No, it doesn't really make sense. String literals are passed as two arguments to operator"", and one of them is size, so what you want is:

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

Standard quote time (2.14.8.5):

5 If L is a user-defined-string-literal, let str be the literal without its ud-suffix and let len be the number of code units in str (i.e., its length excluding the terminating null character). The literal L is treated as a call of the form

operator "" X (str, len)

The variadic template forms are considered only for user-defined-integer-literal (2.14.8.3) and user-defined-floating-literal (2.14.8.4).

As for method_call, method is not a literal.

余生共白头 2024-12-22 14:02:48

method_call 是一个有效的标识符,例如 some_callmy_call。现在想象一下,如果允许 operator"" 重新定义此类标识符,将会破坏多少代码。

method_call is a valid identifier As is for example some_call or my_call. Now imagine how much code would be broken if such identifiers were allowed to be redefined by operator"".

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文