可变char模板的用户定义字面值

User defined literals for variadic char template

本文关键字:用户 定义 字面值 char 可变      更新时间:2023-10-16

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

?

有什么意义?

这是因为模棱两可吗?

谢谢。

不,这真的没有意义。字符串字面值作为两个参数传递给operator"",其中一个是size,所以您想要的是:

size_t operator"" _call(const char*, size_t len) {
    return len;
}
标准报价时间(2.14.8.5):
如果L是用户定义的字符串字面值,则设str为不含ud-suffix的字面值,并设lenstr中的代码单元数(即,其长度不包括终止的null字符)。字面值L被视为形式为 的调用
operator "" X (str, len)

可变变量模板形式只考虑用户定义的整数-literal(2.14.8.3)和用户定义的浮点-literal(2.14.8.4)。

对于method_call, method不是文字

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