翻訳の第 1 段階 ( ISO/IEC 14882:2011(E)の §2.2/1 ) では、トリグラフ シーケンスと呼ばれる一連の文字が単一の文字に置き換えられます。
Trigraph シーケンス (2.4) は、対応する単一文字の内部表現に置き換えられます。
トライグラフの 1 つが にマップ??/
され\
ます。最初のフェーズの後、コードは次のようになります。
#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??
これを回避するには、疑問符の 1 つを としてエスケープする必要があります\?
。これにより、以下が得られます。
#include <iostream>
#include <string>
int main(int argc, const char* argv[])
{
std::string s = "finished?\?/not finished??";
std::cout << s << std::endl;
return 0;
}
??/
これにより、トリグラフとして取り上げられることを回避できます。