我花了一些时间来诊断错误,其中我丢失了使用
std::string_literals
创建的两个字符串之间的逗号。最小可重现代码如下:
#include <iostream>
template <class ...Tx>
void consume_all(Tx&& ...tx)
{
((std::cout << tx),...);
}
int main()
{
using namespace std::string_literals;
consume_all(
"abc"s // comma is missed there
"123"s
);
}
代码在 MSVC 2022 和 Clang 6.0 上编译没有任何错误。所以我的问题是:规范的哪一部分描述了这种行为?
这并非特定于用户定义的字符串文字。
您可以(而且总是可以,在 C 中已经如此)通过直接一个接一个地写入多个字符串文字来连接它们,可能用空格分隔。
用户定义的文字后缀不得冲突(即不得有两个不同的后缀),但否则它会以相同的方式与用户定义的文字一起工作。
"abc"s // comma is missed there
"123"s
完全等同于
"abc123"s
串联是在预处理之后、对源进行任何其他分析之前完成的。