c++17 用户定义的文字对于字符串序列的奇怪行为

问题描述 投票:0回答:1

我花了一些时间来诊断错误,其中我丢失了使用

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++ c++17 string-literals
1个回答
0
投票

这并非特定于用户定义的字符串文字。

您可以(而且总是可以,在 C 中已经如此)通过直接一个接一个地写入多个字符串文字来连接它们,可能用空格分隔。

用户定义的文字后缀不得冲突(即不得有两个不同的后缀),但否则它会以相同的方式与用户定义的文字一起工作。

        "abc"s // comma is missed there
        "123"s

完全等同于

        "abc123"s

串联是在预处理之后、对源进行任何其他分析之前完成的。

© www.soinside.com 2019 - 2024. All rights reserved.