在翻譯中的第一階段(的§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' 爲不是一個新行字符。 –