在翻译的第一阶段(ISO/IEC 14882:2011(E)的第 2.2/1 节),称为三字符序列的字符序列被替换为单个字符。
三字母序列 (2.4) 被相应的单字符内部表示代替。
三元组之一映射??/
到\
。第一阶段之后,代码等价于:
#include <iostream>
#include <string>
int main(int argc, const char* argv[])
{
std::string s = "finished\not finished??";
std::cout << s << std::endl;
return 0;
}
作为预处理阶段的结果,"finished\not finished??"
被解析为包含转义序列的字符串文字\n
,该转义序列表示换行符。因此,输出的字符串是:finished<NL>ot finished??
。
为避免这种情况,您需要将其中一个问号转义为\?
. 这给了你:
#include <iostream>
#include <string>
int main(int argc, const char* argv[])
{
std::string s = "finished?\?/not finished??";
std::cout << s << std::endl;
return 0;
}
这避免??/
了作为三合符被拾取。