会,但仅限于编译期可见的相邻c风格字符串字面量(const char*),如"hello" "world";std::string对象间不支持自动拼接,必须用+运算符或成员函数。

会,但仅限于 C 风格字符串字面量(const char*),且必须是编译期可见的相邻字面量;std::string 对象之间不会自动拼接。
哪些情况算“相邻字面量”
编译器在翻译单元(translation unit)阶段,会把紧挨着、中间只有空白符(空格、制表符、换行)分隔的多个 "..." 字面量合并成一个。这个行为由 C 和 C++ 标准明确定义,不是编译器扩展。
-
"hello" "world"→ 等价于"helloworld" -
"SELECT * FROM ""users ""WHERE id = ?"→ 合并为单个 C 字符串 - 支持跨行:
"line one "\n"line two"是合法的(注意换行符需显式写进字面量里) - 不支持带宏展开后的拼接:比如
#define A "a",A "b"不会拼接 —— 宏替换发生在词法分析后,拼接发生在更早的“字符串字面量连接阶段”
为什么 std::string 不能这么用
std::string 是运行时对象,它的拼接必须通过运算符或成员函数完成。下面这些写法全部报错:
-
std::string("a") std::string("b")—— 语法错误,两个表达式紧挨着无意义 -
"a" + "b"—— 错误:const char*之间没有定义+运算符 -
"a"s "b"s—— C++20 的"a"s是std::string字面量,但两个std::string字面量相邻仍不触发拼接
真正有效的写法是:std::string("a") + "b" 或 "a"s + "b"(后者依赖 operator+ 重载,不是编译期拼接)。
容易踩的坑:续行符和原始字符串
有人误以为用反斜杠 \ 换行就能拼接字符串字面量,其实不行:
-
"hello \world"—— 这是非法的:C++ 不允许用\续行字符串字面量内部(只允许在宏定义或预处理指令中续行) -
R"(a)" R"(b)"—— 错误:原始字符串字面量之间不支持自动拼接,R"(a)" "b"才合法(前者是原始字符串,后者是普通字符串,类型不同但可拼接) - 拼接后长度超长可能触发编译器警告(如 GCC 的
-Wstringop-overflow),尤其在 SQL 或 JSON 字面量中嵌套多层时
最常被忽略的一点:这种拼接只发生在源码层级,生成的二进制里就是一块连续的只读字符数组;一旦涉及变量、函数调用或任何运行时值,就完全脱离这个机制 —— 别指望 some_func() "suffix" 能自动连上。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











