次のプログラムはコンパイルされません。
#include <iostream>
int main() {
std::cout << R"RAW_STRING_LITERAL(
hello
world
)RAW_STRING_LITERAL";
}
エラー: raw string delimiter longer than 16 characters
。
生の文字列区切り文字に長さの制限があるのはなぜですか?
次のプログラムはコンパイルされません。
#include <iostream>
int main() {
std::cout << R"RAW_STRING_LITERAL(
hello
world
)RAW_STRING_LITERAL";
}
エラー: raw string delimiter longer than 16 characters
。
生の文字列区切り文字に長さの制限があるのはなぜですか?
生の文字列リテラルについて私が見つけることができる最も初期の提案は、Beman Dawesによる N2146です。次のテキストが含まれています。
d-char-sequenceの最大長は16 文字です。
これは作成者によって課せられた恣意的な制限のようです。作成者はおそらく、すべての場合において明確な区切り文字シーケンスを作成するには 16 文字で十分であると判断しました。
提案書にも記載されています
生の文字列リテラルの終端のd-char-sequenceは、最初のd-char-sequenceと同じ文字列でなければならない
したがって、適合する実装では、d-char-sequenceをバッファリングして処理し、2 つのシーケンスが一致することを確認する必要があります。d-char-sequenceに制限がないと、機能の実装が不必要に複雑になります。
この規格では、次のように規定されています。
プレフィックスに R が含まれる文字列リテラルは、生の文字列リテラルです。d-char-sequence は区切り文字として機能します。raw-string の最後の d-char-sequence は、最初の d-charsequence と同じ文字列です。d-char-sequence は最大 16 文字で構成されます
http://open-std.org/JTC1/SC22/WG21/docs/papers/2015/n4527.pdf § 2.13.5 ページ 28
標準では理由は示されていませんが、区切り文字が何であるかにまったく違いがないため、これは完全にランダムな制限として表示されます。