在翻译中的第一阶段(的§2.2/ 1 ISO/IEC 14882:2011(E)),称为三字母序列字符序列被替换为单个字符。
Trigraph序列(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;
}
这样就避免了??/
被三角图拾取。
@ahenderson - '/ n' 为不是一个新行字符。 –