英文:
What is wrong with operator"" _Bq?
问题
在[over.literal]上,我读到在示例列表中,以下内容是有效的:
double operator""_Bq(long double);
而以下内容是无效的:
double operator"" _Bq(long double);
这显然是因为""
后面有空格。
现在,从链接页面,我可以轻松跳转到[usrlit.suffix]并阅读到:
不以下划线开头的文字后缀标识符已保留供未来标准化使用。
好的,但我在哪里可以找到有关operator"" _Bq
为什么无效的解释呢?
我还阅读了cppreference上user-defined-string-literal
的描述,但说实话,我觉得有点混乱。
有人可以用示例来解释一下吗?
英文:
At [over.literal] I read, in the list of examples, that
double operator""_Bq(long double);
is valid, whereas
double operator"" _Bq(long double);
is ill-formed, which is apparently a consequence of the space right after ""
.
Now, from the linked page, I can easily get to [usrlit.suffix] with one click and I read that
> Literal suffix identifiers that do not start with an underscore are reserved for future standardization.
Good, but where do I read why operator"" _Bq
is invalid?
I've also read the description of user-defined-string-literal
on cppreference, but to be honest I've found it a bit confusing.
Can anybody break that down with examples?
答案1
得分: 7
""" _Bq
" 是一个由 字符串字面值 后跟一个 标识符 组成的,而 """_Bq
" 是一个 用户定义的字符串字面值,它是一个单一且不同的预处理标记([lex.pptoken])。
因此,前者受宏展开的影响,但后者不受影响:
#define _x
int operator "" _x(char); // 变成 `int operator "" (char);`,这是无效的
int operator ""_x(char); // 可行
除此之外,这两种形式都作为 字面值运算符标识符 被允许,并且具有相同的含义。然而,由于形成第一个构造涉及使用保留的 标识符,它根据 [lex.name]/3 被认为是非法的,不需要诊断(其背后的动机是 _Bq
可能被实现用作宏)。
这就是意图,但目前的规范措辞实际上并没有清晰说明这个差异:用户定义的字符串字面值 最终包含一个 标识符,而 [lex.name]/3 没有表明它仅适用于那些自身是预处理标记的标识符。这是 CWG2521 的主题。
英文:
"" _Bq
is a string-literal followed by an identifier, whereas ""_Bq
is a user-defined-string-literal which is a single, distinct preprocessing token ([lex.pptoken]).
As a consequence, the former is affected by macro expansion, but the latter is not:
#define _x
int operator "" _x(char); // becomes `int operator "" (char);` which is invalid
int operator ""_x(char); // ok
That aside, both forms are allowed as part of a literal-operator-id and have the same meaning. However, since forming the first construct involves the use of a reserved identifier, it is ill-formed with no diagnostic required per [lex.name]/3 (motivation for this being that _Bq
could be in use by the implementation as a macro).
That's the intent, anyway. The current normative wording does not actually make that difference clear enough: user-defined-string-literal ultimately contains an identifier, and [lex.name]/3 has no indication that it only applies to identifiers that are themselves preprocessing tokens. This is the subject of CWG2521.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论