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

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

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

标准报价时间(2.14.8.5):

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

operator "" X (str, len)

可变参数模板形式仅适用于用户定义的整数文字(2.14.8.3) 和用户定义的浮动文字(2.14.8.4)。

至于method_call,method不是文字。

于 2011-11-11T18:01:43.030 回答
1

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

于 2011-11-11T18:30:29.270 回答