运算符“”_Bq出了什么问题?

Enr*_*lis 1 c++ reserved-words language-lawyer user-defined-literals c++20

[over.literal]我在示例列表中读到,

double operator""_Bq(long double);
Run Code Online (Sandbox Code Playgroud)

是有效的,而

double operator"" _Bq(long double);
Run Code Online (Sandbox Code Playgroud)

格式不正确,这显然是由于 后面的空格造成的""

现在,从链接页面,我可以轻松地一键访问[usrlit.suffix] ,然后我读到了

不以下划线开头的文字后缀标识符保留用于将来的标准化。

很好,但是我在哪里读到为什么operator"" _Bq无效?

user-defined-string-literal我还阅读了on cppreference的描述,但说实话,我发现它有点令人困惑。

有人能用例子来解释一下吗?

duc*_*uck 7

"" _Bq是一个字符串文字,后跟一个标识符,而""_Bq是一个用户定义的字符串文字,它是一个单独的、不同的预处理标记 ( [lex.pptoken] )。

因此,前者受到宏展开的影响,而后者则不受宏展开的影响:

#define _x
int operator "" _x(char); // becomes `int operator "" (char);` which is invalid
int operator ""_x(char);  // ok
Run Code Online (Sandbox Code Playgroud)

除此之外,这两种形式都可以作为literal-operator-id的一部分,并且具有相同的含义。然而,由于形成第一个构造涉及使用保留的标识符,因此它的格式不正确,不需要每个[lex.name]/3进行诊断(这样做的动机是_Bq实现可以将其用作宏)。


无论如何,这就是意图。当前的规范措辞实际上并没有使这种差异足够清楚:用户定义的字符串文字最终包含一个标识符,并且 [lex.name]/3 没有表明它仅适用于本身就是预处理标记的标识符。这是CWG2521的主题。